diff options
author | Thomas Lively <7121787+tlively@users.noreply.github.com> | 2020-10-27 08:58:36 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-27 08:58:36 -0700 |
commit | ca16f7cdc57549333474d7042128d2007bc35fad (patch) | |
tree | c42bffa8027099b9d4f5cb6c2283571bd06950c5 | |
parent | 91ac3be4364e6f9763d6ccff35c83fab0692ef5c (diff) | |
download | binaryen-ca16f7cdc57549333474d7042128d2007bc35fad.tar.gz binaryen-ca16f7cdc57549333474d7042128d2007bc35fad.tar.bz2 binaryen-ca16f7cdc57549333474d7042128d2007bc35fad.zip |
Implement i8x16.popcnt (#3286)
As proposed in https://github.com/WebAssembly/simd/pull/379. Since this
instruction is still being evaluated for inclusion in the SIMD proposal, this PR
does not add support for it to the C/JS APIs or to the fuzzer. This PR also
performs a drive-by fix for unrelated instructions in c-api-kitchen-sink.c
-rwxr-xr-x | scripts/gen-s-parser.py | 1 | ||||
-rw-r--r-- | src/binaryen-c.h | 1 | ||||
-rw-r--r-- | src/gen-s-parser.inc | 3 | ||||
-rw-r--r-- | src/ir/cost.h | 1 | ||||
-rw-r--r-- | src/literal.h | 1 | ||||
-rw-r--r-- | src/passes/Print.cpp | 3 | ||||
-rw-r--r-- | src/tools/fuzzing.h | 1 | ||||
-rw-r--r-- | src/wasm-binary.h | 2 | ||||
-rw-r--r-- | src/wasm-interpreter.h | 2 | ||||
-rw-r--r-- | src/wasm.h | 1 | ||||
-rw-r--r-- | src/wasm/literal.cpp | 3 | ||||
-rw-r--r-- | src/wasm/wasm-binary.cpp | 4 | ||||
-rw-r--r-- | src/wasm/wasm-stack.cpp | 4 | ||||
-rw-r--r-- | src/wasm/wasm-validator.cpp | 1 | ||||
-rw-r--r-- | src/wasm/wasm.cpp | 1 | ||||
-rw-r--r-- | test/example/c-api-kitchen-sink.c | 16 | ||||
-rw-r--r-- | test/example/c-api-kitchen-sink.txt | 24 | ||||
-rw-r--r-- | test/simd.wast | 5 | ||||
-rw-r--r-- | test/simd.wast.from-wast | 5 | ||||
-rw-r--r-- | test/simd.wast.fromBinary | 5 | ||||
-rw-r--r-- | test/simd.wast.fromBinary.noDebugInfo | 267 | ||||
-rw-r--r-- | test/spec/simd.wast | 4 |
22 files changed, 200 insertions, 155 deletions
diff --git a/scripts/gen-s-parser.py b/scripts/gen-s-parser.py index 7fd3d1ec6..358f3f0b1 100755 --- a/scripts/gen-s-parser.py +++ b/scripts/gen-s-parser.py @@ -358,6 +358,7 @@ instructions = [ ("v128.store16_lane", "makeSIMDLoadStoreLane(s, StoreLaneVec16x8)"), ("v128.store32_lane", "makeSIMDLoadStoreLane(s, StoreLaneVec32x4)"), ("v128.store64_lane", "makeSIMDLoadStoreLane(s, StoreLaneVec64x2)"), + ("i8x16.popcnt", "makeUnary(s, UnaryOp::PopcntVecI8x16)"), ("i8x16.abs", "makeUnary(s, UnaryOp::AbsVecI8x16)"), ("i8x16.neg", "makeUnary(s, UnaryOp::NegVecI8x16)"), ("i8x16.any_true", "makeUnary(s, UnaryOp::AnyTrueVecI8x16)"), diff --git a/src/binaryen-c.h b/src/binaryen-c.h index ecf0027f3..83477e8d1 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -485,6 +485,7 @@ BINARYEN_API BinaryenOp BinaryenOrVec128(void); BINARYEN_API BinaryenOp BinaryenXorVec128(void); BINARYEN_API BinaryenOp BinaryenAndNotVec128(void); BINARYEN_API BinaryenOp BinaryenBitselectVec128(void); +// TODO: Add i8x16.popcnt to C and JS APIs once merged to proposal BINARYEN_API BinaryenOp BinaryenAbsVecI8x16(void); BINARYEN_API BinaryenOp BinaryenNegVecI8x16(void); BINARYEN_API BinaryenOp BinaryenAnyTrueVecI8x16(void); diff --git a/src/gen-s-parser.inc b/src/gen-s-parser.inc index 2bbcde499..47ea6c969 100644 --- a/src/gen-s-parser.inc +++ b/src/gen-s-parser.inc @@ -2492,6 +2492,9 @@ switch (op[0]) { default: goto parse_error; } } + case 'p': + if (strcmp(op, "i8x16.popcnt") == 0) { return makeUnary(s, UnaryOp::PopcntVecI8x16); } + goto parse_error; case 'r': if (strcmp(op, "i8x16.replace_lane") == 0) { return makeSIMDReplace(s, SIMDReplaceOp::ReplaceLaneVecI8x16, 16); } goto parse_error; diff --git a/src/ir/cost.h b/src/ir/cost.h index 5df4917e4..1095ff76e 100644 --- a/src/ir/cost.h +++ b/src/ir/cost.h @@ -157,6 +157,7 @@ struct CostAnalyzer : public Visitor<CostAnalyzer, Index> { case AnyTrueVecI8x16: case AllTrueVecI8x16: case BitmaskVecI8x16: + case PopcntVecI8x16: case AbsVecI16x8: case NegVecI16x8: case AnyTrueVecI16x8: diff --git a/src/literal.h b/src/literal.h index 4f300291e..8ead70fc7 100644 --- a/src/literal.h +++ b/src/literal.h @@ -488,6 +488,7 @@ public: Literal maxSI8x16(const Literal& other) const; Literal maxUI8x16(const Literal& other) const; Literal avgrUI8x16(const Literal& other) const; + Literal popcntI8x16() const; Literal absI16x8() const; Literal negI16x8() const; Literal anyTrueI16x8() const; diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp index baf0a325e..c093158f3 100644 --- a/src/passes/Print.cpp +++ b/src/passes/Print.cpp @@ -774,6 +774,9 @@ struct PrintExpressionContents case BitmaskVecI8x16: o << "i8x16.bitmask"; break; + case PopcntVecI8x16: + o << "i8x16.popcnt"; + break; case AbsVecI16x8: o << "i16x8.abs"; break; diff --git a/src/tools/fuzzing.h b/src/tools/fuzzing.h index d6ce27b31..709ebe1e8 100644 --- a/src/tools/fuzzing.h +++ b/src/tools/fuzzing.h @@ -2026,6 +2026,7 @@ private: return buildUnary({SplatVecF64x2, make(Type::f64)}); case 4: return buildUnary({pick(NotVec128, + // TODO: i8x16.popcnt once merged NegVecI8x16, NegVecI16x8, NegVecI32x4, diff --git a/src/wasm-binary.h b/src/wasm-binary.h index 1faf30716..e1247a2d4 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -823,6 +823,8 @@ enum ASTNodes { I8x16MaxU = 0x79, I8x16AvgrU = 0x7b, + I8x16Popcnt = 0x7c, + I16x8Abs = 0x80, I16x8Neg = 0x81, I16x8AnyTrue = 0x82, diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index d84591a00..932f97dd3 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -463,6 +463,8 @@ public: return value.allTrueI8x16(); case BitmaskVecI8x16: return value.bitmaskI8x16(); + case PopcntVecI8x16: + return value.popcntI8x16(); case AbsVecI16x8: return value.absI16x8(); case NegVecI16x8: diff --git a/src/wasm.h b/src/wasm.h index 048b6c584..04e2faeb3 100644 --- a/src/wasm.h +++ b/src/wasm.h @@ -161,6 +161,7 @@ enum UnaryOp { AnyTrueVecI8x16, AllTrueVecI8x16, BitmaskVecI8x16, + PopcntVecI8x16, AbsVecI16x8, NegVecI16x8, AnyTrueVecI16x8, diff --git a/src/wasm/literal.cpp b/src/wasm/literal.cpp index 360b514c5..f549a9ca6 100644 --- a/src/wasm/literal.cpp +++ b/src/wasm/literal.cpp @@ -1653,6 +1653,9 @@ Literal Literal::absI32x4() const { Literal Literal::negI8x16() const { return unary<16, &Literal::getLanesUI8x16, &Literal::neg>(*this); } +Literal Literal::popcntI8x16() const { + return unary<16, &Literal::getLanesUI8x16, &Literal::popCount>(*this); +} Literal Literal::negI16x8() const { return unary<8, &Literal::getLanesUI16x8, &Literal::neg>(*this); } diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index d9ddaa614..5c25fd0d2 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -4478,6 +4478,10 @@ bool WasmBinaryBuilder::maybeVisitSIMDUnary(Expression*& out, uint32_t code) { curr = allocator.alloc<Unary>(); curr->op = NotVec128; break; + case BinaryConsts::I8x16Popcnt: + curr = allocator.alloc<Unary>(); + curr->op = PopcntVecI8x16; + break; case BinaryConsts::I8x16Abs: curr = allocator.alloc<Unary>(); curr->op = AbsVecI8x16; diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp index 13ce700a5..2ec156eea 100644 --- a/src/wasm/wasm-stack.cpp +++ b/src/wasm/wasm-stack.cpp @@ -971,6 +971,10 @@ void BinaryInstWriter::visitUnary(Unary* curr) { o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I8x16Bitmask); break; + case PopcntVecI8x16: + o << int8_t(BinaryConsts::SIMDPrefix) + << U32LEB(BinaryConsts::I8x16Popcnt); + break; case AbsVecI16x8: o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I16x8Abs); break; diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp index 31b68a80c..e09a8fb36 100644 --- a/src/wasm/wasm-validator.cpp +++ b/src/wasm/wasm-validator.cpp @@ -1875,6 +1875,7 @@ void FunctionValidator::visitUnary(Unary* curr) { curr->value->type, Type(Type::f64), curr, "expected f64 splat value"); break; case NotVec128: + case PopcntVecI8x16: case AbsVecI8x16: case AbsVecI16x8: case AbsVecI32x4: diff --git a/src/wasm/wasm.cpp b/src/wasm/wasm.cpp index 472902ad5..3db76d86e 100644 --- a/src/wasm/wasm.cpp +++ b/src/wasm/wasm.cpp @@ -826,6 +826,7 @@ void Unary::finalize() { case AbsVecI8x16: case AbsVecI16x8: case AbsVecI32x4: + case PopcntVecI8x16: case NegVecI8x16: case NegVecI16x8: case NegVecI32x4: diff --git a/test/example/c-api-kitchen-sink.c b/test/example/c-api-kitchen-sink.c index 118fcb3f3..a8aa05c4a 100644 --- a/test/example/c-api-kitchen-sink.c +++ b/test/example/c-api-kitchen-sink.c @@ -580,10 +580,10 @@ void test_core() { makeBinary(module, BinaryenMaxVecF32x4(), v128), makeBinary(module, BinaryenPMinVecF32x4(), v128), makeBinary(module, BinaryenPMaxVecF32x4(), v128), - makeBinary(module, BinaryenCeilVecF32x4(), v128), - makeBinary(module, BinaryenFloorVecF32x4(), v128), - makeBinary(module, BinaryenTruncVecF32x4(), v128), - makeBinary(module, BinaryenNearestVecF32x4(), v128), + makeUnary(module, BinaryenCeilVecF32x4(), v128), + makeUnary(module, BinaryenFloorVecF32x4(), v128), + makeUnary(module, BinaryenTruncVecF32x4(), v128), + makeUnary(module, BinaryenNearestVecF32x4(), v128), makeBinary(module, BinaryenAddVecF64x2(), v128), makeBinary(module, BinaryenSubVecF64x2(), v128), makeBinary(module, BinaryenMulVecF64x2(), v128), @@ -592,10 +592,10 @@ void test_core() { makeBinary(module, BinaryenMaxVecF64x2(), v128), makeBinary(module, BinaryenPMinVecF64x2(), v128), makeBinary(module, BinaryenPMaxVecF64x2(), v128), - makeBinary(module, BinaryenCeilVecF64x2(), v128), - makeBinary(module, BinaryenFloorVecF64x2(), v128), - makeBinary(module, BinaryenTruncVecF64x2(), v128), - makeBinary(module, BinaryenNearestVecF64x2(), v128), + makeUnary(module, BinaryenCeilVecF64x2(), v128), + makeUnary(module, BinaryenFloorVecF64x2(), v128), + makeUnary(module, BinaryenTruncVecF64x2(), v128), + makeUnary(module, BinaryenNearestVecF64x2(), v128), makeBinary(module, BinaryenNarrowSVecI16x8ToVecI8x16(), v128), makeBinary(module, BinaryenNarrowUVecI16x8ToVecI8x16(), v128), makeBinary(module, BinaryenNarrowSVecI32x4ToVecI16x8(), v128), diff --git a/test/example/c-api-kitchen-sink.txt b/test/example/c-api-kitchen-sink.txt index fe951cdcc..0e85ac18a 100644 --- a/test/example/c-api-kitchen-sink.txt +++ b/test/example/c-api-kitchen-sink.txt @@ -1235,26 +1235,22 @@ BinaryenFeatureAll: 4095 ) ) (drop - (i16x8.lt_s - (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) + (f32x4.ceil (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) ) ) (drop - (i16x8.lt_u - (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) + (f32x4.floor (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) ) ) (drop - (i16x8.gt_s - (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) + (f32x4.trunc (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) ) ) (drop - (i16x8.gt_u - (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) + (f32x4.nearest (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) ) ) @@ -1307,26 +1303,22 @@ BinaryenFeatureAll: 4095 ) ) (drop - (i16x8.ge_u - (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) + (f64x2.ceil (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) ) ) (drop - (i32x4.eq - (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) + (f64x2.floor (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) ) ) (drop - (i32x4.ne - (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) + (f64x2.trunc (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) ) ) (drop - (i32x4.lt_s - (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) + (f64x2.nearest (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) ) ) diff --git a/test/simd.wast b/test/simd.wast index 6bca3f1b4..fd430d4ed 100644 --- a/test/simd.wast +++ b/test/simd.wast @@ -508,6 +508,11 @@ (local.get $1) ) ) + (func $i8x16.popcnt (param $0 v128) (result v128) + (i8x16.popcnt + (local.get $0) + ) + ) (func $i8x16.abs (param $0 v128) (result v128) (i8x16.abs (local.get $0) diff --git a/test/simd.wast.from-wast b/test/simd.wast.from-wast index e402bab08..66fb68baa 100644 --- a/test/simd.wast.from-wast +++ b/test/simd.wast.from-wast @@ -525,6 +525,11 @@ (local.get $1) ) ) + (func $i8x16.popcnt (param $0 v128) (result v128) + (i8x16.popcnt + (local.get $0) + ) + ) (func $i8x16.abs (param $0 v128) (result v128) (i8x16.abs (local.get $0) diff --git a/test/simd.wast.fromBinary b/test/simd.wast.fromBinary index 932b45950..1b5c59e35 100644 --- a/test/simd.wast.fromBinary +++ b/test/simd.wast.fromBinary @@ -525,6 +525,11 @@ (local.get $1) ) ) + (func $i8x16.popcnt (param $0 v128) (result v128) + (i8x16.popcnt + (local.get $0) + ) + ) (func $i8x16.abs (param $0 v128) (result v128) (i8x16.abs (local.get $0) diff --git a/test/simd.wast.fromBinary.noDebugInfo b/test/simd.wast.fromBinary.noDebugInfo index 71bf02e56..8bfe343c9 100644 --- a/test/simd.wast.fromBinary.noDebugInfo +++ b/test/simd.wast.fromBinary.noDebugInfo @@ -526,736 +526,741 @@ ) ) (func $90 (param $0 v128) (result v128) - (i8x16.abs + (i8x16.popcnt (local.get $0) ) ) (func $91 (param $0 v128) (result v128) + (i8x16.abs + (local.get $0) + ) + ) + (func $92 (param $0 v128) (result v128) (i8x16.neg (local.get $0) ) ) - (func $92 (param $0 v128) (result i32) + (func $93 (param $0 v128) (result i32) (i8x16.any_true (local.get $0) ) ) - (func $93 (param $0 v128) (result i32) + (func $94 (param $0 v128) (result i32) (i8x16.all_true (local.get $0) ) ) - (func $94 (param $0 v128) (result i32) + (func $95 (param $0 v128) (result i32) (i8x16.bitmask (local.get $0) ) ) - (func $95 (param $0 v128) (param $1 i32) (result v128) + (func $96 (param $0 v128) (param $1 i32) (result v128) (i8x16.shl (local.get $0) (local.get $1) ) ) - (func $96 (param $0 v128) (param $1 i32) (result v128) + (func $97 (param $0 v128) (param $1 i32) (result v128) (i8x16.shr_s (local.get $0) (local.get $1) ) ) - (func $97 (param $0 v128) (param $1 i32) (result v128) + (func $98 (param $0 v128) (param $1 i32) (result v128) (i8x16.shr_u (local.get $0) (local.get $1) ) ) - (func $98 (param $0 v128) (param $1 v128) (result v128) + (func $99 (param $0 v128) (param $1 v128) (result v128) (i8x16.add (local.get $0) (local.get $1) ) ) - (func $99 (param $0 v128) (param $1 v128) (result v128) + (func $100 (param $0 v128) (param $1 v128) (result v128) (i8x16.add_saturate_s (local.get $0) (local.get $1) ) ) - (func $100 (param $0 v128) (param $1 v128) (result v128) + (func $101 (param $0 v128) (param $1 v128) (result v128) (i8x16.add_saturate_u (local.get $0) (local.get $1) ) ) - (func $101 (param $0 v128) (param $1 v128) (result v128) + (func $102 (param $0 v128) (param $1 v128) (result v128) (i8x16.sub (local.get $0) (local.get $1) ) ) - (func $102 (param $0 v128) (param $1 v128) (result v128) + (func $103 (param $0 v128) (param $1 v128) (result v128) (i8x16.sub_saturate_s (local.get $0) (local.get $1) ) ) - (func $103 (param $0 v128) (param $1 v128) (result v128) + (func $104 (param $0 v128) (param $1 v128) (result v128) (i8x16.sub_saturate_u (local.get $0) (local.get $1) ) ) - (func $104 (param $0 v128) (param $1 v128) (result v128) + (func $105 (param $0 v128) (param $1 v128) (result v128) (i8x16.mul (local.get $0) (local.get $1) ) ) - (func $105 (param $0 v128) (param $1 v128) (result v128) + (func $106 (param $0 v128) (param $1 v128) (result v128) (i8x16.min_s (local.get $0) (local.get $1) ) ) - (func $106 (param $0 v128) (param $1 v128) (result v128) + (func $107 (param $0 v128) (param $1 v128) (result v128) (i8x16.min_u (local.get $0) (local.get $1) ) ) - (func $107 (param $0 v128) (param $1 v128) (result v128) + (func $108 (param $0 v128) (param $1 v128) (result v128) (i8x16.max_s (local.get $0) (local.get $1) ) ) - (func $108 (param $0 v128) (param $1 v128) (result v128) + (func $109 (param $0 v128) (param $1 v128) (result v128) (i8x16.max_u (local.get $0) (local.get $1) ) ) - (func $109 (param $0 v128) (param $1 v128) (result v128) + (func $110 (param $0 v128) (param $1 v128) (result v128) (i8x16.avgr_u (local.get $0) (local.get $1) ) ) - (func $110 (param $0 v128) (result v128) + (func $111 (param $0 v128) (result v128) (i16x8.abs (local.get $0) ) ) - (func $111 (param $0 v128) (result v128) + (func $112 (param $0 v128) (result v128) (i16x8.neg (local.get $0) ) ) - (func $112 (param $0 v128) (result i32) + (func $113 (param $0 v128) (result i32) (i16x8.any_true (local.get $0) ) ) - (func $113 (param $0 v128) (result i32) + (func $114 (param $0 v128) (result i32) (i16x8.all_true (local.get $0) ) ) - (func $114 (param $0 v128) (result i32) + (func $115 (param $0 v128) (result i32) (i16x8.bitmask (local.get $0) ) ) - (func $115 (param $0 v128) (param $1 i32) (result v128) + (func $116 (param $0 v128) (param $1 i32) (result v128) (i16x8.shl (local.get $0) (local.get $1) ) ) - (func $116 (param $0 v128) (param $1 i32) (result v128) + (func $117 (param $0 v128) (param $1 i32) (result v128) (i16x8.shr_s (local.get $0) (local.get $1) ) ) - (func $117 (param $0 v128) (param $1 i32) (result v128) + (func $118 (param $0 v128) (param $1 i32) (result v128) (i16x8.shr_u (local.get $0) (local.get $1) ) ) - (func $118 (param $0 v128) (param $1 v128) (result v128) + (func $119 (param $0 v128) (param $1 v128) (result v128) (i16x8.add (local.get $0) (local.get $1) ) ) - (func $119 (param $0 v128) (param $1 v128) (result v128) + (func $120 (param $0 v128) (param $1 v128) (result v128) (i16x8.add_saturate_s (local.get $0) (local.get $1) ) ) - (func $120 (param $0 v128) (param $1 v128) (result v128) + (func $121 (param $0 v128) (param $1 v128) (result v128) (i16x8.add_saturate_u (local.get $0) (local.get $1) ) ) - (func $121 (param $0 v128) (param $1 v128) (result v128) + (func $122 (param $0 v128) (param $1 v128) (result v128) (i16x8.sub (local.get $0) (local.get $1) ) ) - (func $122 (param $0 v128) (param $1 v128) (result v128) + (func $123 (param $0 v128) (param $1 v128) (result v128) (i16x8.sub_saturate_s (local.get $0) (local.get $1) ) ) - (func $123 (param $0 v128) (param $1 v128) (result v128) + (func $124 (param $0 v128) (param $1 v128) (result v128) (i16x8.sub_saturate_u (local.get $0) (local.get $1) ) ) - (func $124 (param $0 v128) (param $1 v128) (result v128) + (func $125 (param $0 v128) (param $1 v128) (result v128) (i16x8.mul (local.get $0) (local.get $1) ) ) - (func $125 (param $0 v128) (param $1 v128) (result v128) + (func $126 (param $0 v128) (param $1 v128) (result v128) (i16x8.min_s (local.get $0) (local.get $1) ) ) - (func $126 (param $0 v128) (param $1 v128) (result v128) + (func $127 (param $0 v128) (param $1 v128) (result v128) (i16x8.min_u (local.get $0) (local.get $1) ) ) - (func $127 (param $0 v128) (param $1 v128) (result v128) + (func $128 (param $0 v128) (param $1 v128) (result v128) (i16x8.max_s (local.get $0) (local.get $1) ) ) - (func $128 (param $0 v128) (param $1 v128) (result v128) + (func $129 (param $0 v128) (param $1 v128) (result v128) (i16x8.max_u (local.get $0) (local.get $1) ) ) - (func $129 (param $0 v128) (param $1 v128) (result v128) + (func $130 (param $0 v128) (param $1 v128) (result v128) (i16x8.avgr_u (local.get $0) (local.get $1) ) ) - (func $130 (param $0 v128) (result v128) + (func $131 (param $0 v128) (result v128) (i32x4.abs (local.get $0) ) ) - (func $131 (param $0 v128) (result v128) + (func $132 (param $0 v128) (result v128) (i32x4.neg (local.get $0) ) ) - (func $132 (param $0 v128) (result i32) + (func $133 (param $0 v128) (result i32) (i32x4.any_true (local.get $0) ) ) - (func $133 (param $0 v128) (result i32) + (func $134 (param $0 v128) (result i32) (i32x4.all_true (local.get $0) ) ) - (func $134 (param $0 v128) (result i32) + (func $135 (param $0 v128) (result i32) (i32x4.bitmask (local.get $0) ) ) - (func $135 (param $0 v128) (param $1 i32) (result v128) + (func $136 (param $0 v128) (param $1 i32) (result v128) (i32x4.shl (local.get $0) (local.get $1) ) ) - (func $136 (param $0 v128) (param $1 i32) (result v128) + (func $137 (param $0 v128) (param $1 i32) (result v128) (i32x4.shr_s (local.get $0) (local.get $1) ) ) - (func $137 (param $0 v128) (param $1 i32) (result v128) + (func $138 (param $0 v128) (param $1 i32) (result v128) (i32x4.shr_u (local.get $0) (local.get $1) ) ) - (func $138 (param $0 v128) (param $1 v128) (result v128) + (func $139 (param $0 v128) (param $1 v128) (result v128) (i32x4.add (local.get $0) (local.get $1) ) ) - (func $139 (param $0 v128) (param $1 v128) (result v128) + (func $140 (param $0 v128) (param $1 v128) (result v128) (i32x4.sub (local.get $0) (local.get $1) ) ) - (func $140 (param $0 v128) (param $1 v128) (result v128) + (func $141 (param $0 v128) (param $1 v128) (result v128) (i32x4.mul (local.get $0) (local.get $1) ) ) - (func $141 (param $0 v128) (param $1 v128) (result v128) + (func $142 (param $0 v128) (param $1 v128) (result v128) (i32x4.min_s (local.get $0) (local.get $1) ) ) - (func $142 (param $0 v128) (param $1 v128) (result v128) + (func $143 (param $0 v128) (param $1 v128) (result v128) (i32x4.min_u (local.get $0) (local.get $1) ) ) - (func $143 (param $0 v128) (param $1 v128) (result v128) + (func $144 (param $0 v128) (param $1 v128) (result v128) (i32x4.max_s (local.get $0) (local.get $1) ) ) - (func $144 (param $0 v128) (param $1 v128) (result v128) + (func $145 (param $0 v128) (param $1 v128) (result v128) (i32x4.max_u (local.get $0) (local.get $1) ) ) - (func $145 (param $0 v128) (param $1 v128) (result v128) + (func $146 (param $0 v128) (param $1 v128) (result v128) (i32x4.dot_i16x8_s (local.get $0) (local.get $1) ) ) - (func $146 (param $0 v128) (result v128) + (func $147 (param $0 v128) (result v128) (i64x2.neg (local.get $0) ) ) - (func $147 (param $0 v128) (result i32) + (func $148 (param $0 v128) (result i32) (i64x2.any_true (local.get $0) ) ) - (func $148 (param $0 v128) (result i32) + (func $149 (param $0 v128) (result i32) (i64x2.all_true (local.get $0) ) ) - (func $149 (param $0 v128) (param $1 i32) (result v128) + (func $150 (param $0 v128) (param $1 i32) (result v128) (i64x2.shl (local.get $0) (local.get $1) ) ) - (func $150 (param $0 v128) (param $1 i32) (result v128) + (func $151 (param $0 v128) (param $1 i32) (result v128) (i64x2.shr_s (local.get $0) (local.get $1) ) ) - (func $151 (param $0 v128) (param $1 i32) (result v128) + (func $152 (param $0 v128) (param $1 i32) (result v128) (i64x2.shr_u (local.get $0) (local.get $1) ) ) - (func $152 (param $0 v128) (param $1 v128) (result v128) + (func $153 (param $0 v128) (param $1 v128) (result v128) (i64x2.add (local.get $0) (local.get $1) ) ) - (func $153 (param $0 v128) (param $1 v128) (result v128) + (func $154 (param $0 v128) (param $1 v128) (result v128) (i64x2.sub (local.get $0) (local.get $1) ) ) - (func $154 (param $0 v128) (param $1 v128) (result v128) + (func $155 (param $0 v128) (param $1 v128) (result v128) (i64x2.mul (local.get $0) (local.get $1) ) ) - (func $155 (param $0 v128) (param $1 v128) (result v128) + (func $156 (param $0 v128) (param $1 v128) (result v128) (f32x4.add (local.get $0) (local.get $1) ) ) - (func $156 (param $0 v128) (param $1 v128) (result v128) + (func $157 (param $0 v128) (param $1 v128) (result v128) (f32x4.sub (local.get $0) (local.get $1) ) ) - (func $157 (param $0 v128) (param $1 v128) (result v128) + (func $158 (param $0 v128) (param $1 v128) (result v128) (f32x4.mul (local.get $0) (local.get $1) ) ) - (func $158 (param $0 v128) (param $1 v128) (result v128) + (func $159 (param $0 v128) (param $1 v128) (result v128) (f32x4.div (local.get $0) (local.get $1) ) ) - (func $159 (param $0 v128) (param $1 v128) (result v128) + (func $160 (param $0 v128) (param $1 v128) (result v128) (f32x4.min (local.get $0) (local.get $1) ) ) - (func $160 (param $0 v128) (param $1 v128) (result v128) + (func $161 (param $0 v128) (param $1 v128) (result v128) (f32x4.max (local.get $0) (local.get $1) ) ) - (func $161 (param $0 v128) (param $1 v128) (result v128) + (func $162 (param $0 v128) (param $1 v128) (result v128) (f32x4.pmin (local.get $0) (local.get $1) ) ) - (func $162 (param $0 v128) (param $1 v128) (result v128) + (func $163 (param $0 v128) (param $1 v128) (result v128) (f32x4.pmax (local.get $0) (local.get $1) ) ) - (func $163 (param $0 v128) (result v128) + (func $164 (param $0 v128) (result v128) (f32x4.ceil (local.get $0) ) ) - (func $164 (param $0 v128) (result v128) + (func $165 (param $0 v128) (result v128) (f32x4.floor (local.get $0) ) ) - (func $165 (param $0 v128) (result v128) + (func $166 (param $0 v128) (result v128) (f32x4.trunc (local.get $0) ) ) - (func $166 (param $0 v128) (result v128) + (func $167 (param $0 v128) (result v128) (f32x4.nearest (local.get $0) ) ) - (func $167 (param $0 v128) (result v128) + (func $168 (param $0 v128) (result v128) (f32x4.abs (local.get $0) ) ) - (func $168 (param $0 v128) (result v128) + (func $169 (param $0 v128) (result v128) (f32x4.neg (local.get $0) ) ) - (func $169 (param $0 v128) (result v128) + (func $170 (param $0 v128) (result v128) (f32x4.sqrt (local.get $0) ) ) - (func $170 (param $0 v128) (param $1 v128) (param $2 v128) (result v128) + (func $171 (param $0 v128) (param $1 v128) (param $2 v128) (result v128) (f32x4.qfma (local.get $0) (local.get $1) (local.get $2) ) ) - (func $171 (param $0 v128) (param $1 v128) (param $2 v128) (result v128) + (func $172 (param $0 v128) (param $1 v128) (param $2 v128) (result v128) (f32x4.qfms (local.get $0) (local.get $1) (local.get $2) ) ) - (func $172 (param $0 v128) (param $1 v128) (result v128) + (func $173 (param $0 v128) (param $1 v128) (result v128) (f64x2.add (local.get $0) (local.get $1) ) ) - (func $173 (param $0 v128) (param $1 v128) (result v128) + (func $174 (param $0 v128) (param $1 v128) (result v128) (f64x2.sub (local.get $0) (local.get $1) ) ) - (func $174 (param $0 v128) (param $1 v128) (result v128) + (func $175 (param $0 v128) (param $1 v128) (result v128) (f64x2.mul (local.get $0) (local.get $1) ) ) - (func $175 (param $0 v128) (param $1 v128) (result v128) + (func $176 (param $0 v128) (param $1 v128) (result v128) (f64x2.div (local.get $0) (local.get $1) ) ) - (func $176 (param $0 v128) (param $1 v128) (result v128) + (func $177 (param $0 v128) (param $1 v128) (result v128) (f64x2.min (local.get $0) (local.get $1) ) ) - (func $177 (param $0 v128) (param $1 v128) (result v128) + (func $178 (param $0 v128) (param $1 v128) (result v128) (f64x2.max (local.get $0) (local.get $1) ) ) - (func $178 (param $0 v128) (param $1 v128) (result v128) + (func $179 (param $0 v128) (param $1 v128) (result v128) (f64x2.pmin (local.get $0) (local.get $1) ) ) - (func $179 (param $0 v128) (param $1 v128) (result v128) + (func $180 (param $0 v128) (param $1 v128) (result v128) (f64x2.pmax (local.get $0) (local.get $1) ) ) - (func $180 (param $0 v128) (result v128) + (func $181 (param $0 v128) (result v128) (f64x2.ceil (local.get $0) ) ) - (func $181 (param $0 v128) (result v128) + (func $182 (param $0 v128) (result v128) (f64x2.floor (local.get $0) ) ) - (func $182 (param $0 v128) (result v128) + (func $183 (param $0 v128) (result v128) (f64x2.trunc (local.get $0) ) ) - (func $183 (param $0 v128) (result v128) + (func $184 (param $0 v128) (result v128) (f64x2.nearest (local.get $0) ) ) - (func $184 (param $0 v128) (result v128) + (func $185 (param $0 v128) (result v128) (f64x2.abs (local.get $0) ) ) - (func $185 (param $0 v128) (result v128) + (func $186 (param $0 v128) (result v128) (f64x2.neg (local.get $0) ) ) - (func $186 (param $0 v128) (result v128) + (func $187 (param $0 v128) (result v128) (f64x2.sqrt (local.get $0) ) ) - (func $187 (param $0 v128) (param $1 v128) (param $2 v128) (result v128) + (func $188 (param $0 v128) (param $1 v128) (param $2 v128) (result v128) (f64x2.qfma (local.get $0) (local.get $1) (local.get $2) ) ) - (func $188 (param $0 v128) (param $1 v128) (param $2 v128) (result v128) + (func $189 (param $0 v128) (param $1 v128) (param $2 v128) (result v128) (f64x2.qfms (local.get $0) (local.get $1) (local.get $2) ) ) - (func $189 (param $0 v128) (result v128) + (func $190 (param $0 v128) (result v128) (i32x4.trunc_sat_f32x4_s (local.get $0) ) ) - (func $190 (param $0 v128) (result v128) + (func $191 (param $0 v128) (result v128) (i32x4.trunc_sat_f32x4_u (local.get $0) ) ) - (func $191 (param $0 v128) (result v128) + (func $192 (param $0 v128) (result v128) (i64x2.trunc_sat_f64x2_s (local.get $0) ) ) - (func $192 (param $0 v128) (result v128) + (func $193 (param $0 v128) (result v128) (i64x2.trunc_sat_f64x2_u (local.get $0) ) ) - (func $193 (param $0 v128) (result v128) + (func $194 (param $0 v128) (result v128) (f32x4.convert_i32x4_s (local.get $0) ) ) - (func $194 (param $0 v128) (result v128) + (func $195 (param $0 v128) (result v128) (f32x4.convert_i32x4_u (local.get $0) ) ) - (func $195 (param $0 v128) (result v128) + (func $196 (param $0 v128) (result v128) (f64x2.convert_i64x2_s (local.get $0) ) ) - (func $196 (param $0 v128) (result v128) + (func $197 (param $0 v128) (result v128) (f64x2.convert_i64x2_u (local.get $0) ) ) - (func $197 (param $0 i32) (result v128) + (func $198 (param $0 i32) (result v128) (v8x16.load_splat (local.get $0) ) ) - (func $198 (param $0 i32) (result v128) + (func $199 (param $0 i32) (result v128) (v16x8.load_splat (local.get $0) ) ) - (func $199 (param $0 i32) (result v128) + (func $200 (param $0 i32) (result v128) (v32x4.load_splat (local.get $0) ) ) - (func $200 (param $0 i32) (result v128) + (func $201 (param $0 i32) (result v128) (v64x2.load_splat (local.get $0) ) ) - (func $201 (param $0 v128) (param $1 v128) (result v128) + (func $202 (param $0 v128) (param $1 v128) (result v128) (i8x16.narrow_i16x8_s (local.get $0) (local.get $1) ) ) - (func $202 (param $0 v128) (param $1 v128) (result v128) + (func $203 (param $0 v128) (param $1 v128) (result v128) (i8x16.narrow_i16x8_u (local.get $0) (local.get $1) ) ) - (func $203 (param $0 v128) (param $1 v128) (result v128) + (func $204 (param $0 v128) (param $1 v128) (result v128) (i16x8.narrow_i32x4_s (local.get $0) (local.get $1) ) ) - (func $204 (param $0 v128) (param $1 v128) (result v128) + (func $205 (param $0 v128) (param $1 v128) (result v128) (i16x8.narrow_i32x4_u (local.get $0) (local.get $1) ) ) - (func $205 (param $0 v128) (result v128) + (func $206 (param $0 v128) (result v128) (i16x8.widen_low_i8x16_s (local.get $0) ) ) - (func $206 (param $0 v128) (result v128) + (func $207 (param $0 v128) (result v128) (i16x8.widen_high_i8x16_s (local.get $0) ) ) - (func $207 (param $0 v128) (result v128) + (func $208 (param $0 v128) (result v128) (i16x8.widen_low_i8x16_u (local.get $0) ) ) - (func $208 (param $0 v128) (result v128) + (func $209 (param $0 v128) (result v128) (i16x8.widen_high_i8x16_u (local.get $0) ) ) - (func $209 (param $0 v128) (result v128) + (func $210 (param $0 v128) (result v128) (i32x4.widen_low_i16x8_s (local.get $0) ) ) - (func $210 (param $0 v128) (result v128) + (func $211 (param $0 v128) (result v128) (i32x4.widen_high_i16x8_s (local.get $0) ) ) - (func $211 (param $0 v128) (result v128) + (func $212 (param $0 v128) (result v128) (i32x4.widen_low_i16x8_u (local.get $0) ) ) - (func $212 (param $0 v128) (result v128) + (func $213 (param $0 v128) (result v128) (i32x4.widen_high_i16x8_u (local.get $0) ) ) - (func $213 (param $0 i32) (result v128) + (func $214 (param $0 i32) (result v128) (i16x8.load8x8_u (local.get $0) ) ) - (func $214 (param $0 i32) (result v128) + (func $215 (param $0 i32) (result v128) (i16x8.load8x8_s (local.get $0) ) ) - (func $215 (param $0 i32) (result v128) + (func $216 (param $0 i32) (result v128) (i32x4.load16x4_s (local.get $0) ) ) - (func $216 (param $0 i32) (result v128) + (func $217 (param $0 i32) (result v128) (i32x4.load16x4_u (local.get $0) ) ) - (func $217 (param $0 i32) (result v128) + (func $218 (param $0 i32) (result v128) (i64x2.load32x2_s (local.get $0) ) ) - (func $218 (param $0 i32) (result v128) + (func $219 (param $0 i32) (result v128) (i64x2.load32x2_u (local.get $0) ) ) - (func $219 (param $0 i32) (result v128) + (func $220 (param $0 i32) (result v128) (v128.load32_zero (local.get $0) ) ) - (func $220 (param $0 i32) (result v128) + (func $221 (param $0 i32) (result v128) (v128.load64_zero (local.get $0) ) ) - (func $221 (param $0 v128) (param $1 v128) (result v128) + (func $222 (param $0 v128) (param $1 v128) (result v128) (v8x16.swizzle (local.get $0) (local.get $1) diff --git a/test/spec/simd.wast b/test/spec/simd.wast index 1d3f1b835..b08a2db26 100644 --- a/test/spec/simd.wast +++ b/test/spec/simd.wast @@ -112,6 +112,7 @@ (func (export "v128.store16_lane") (param $0 i32) (param $1 v128) (v128.store16_lane 0 (local.get $0) (local.get $1))) (func (export "v128.store32_lane") (param $0 i32) (param $1 v128) (v128.store32_lane 0 (local.get $0) (local.get $1))) (func (export "v128.store64_lane") (param $0 i32) (param $1 v128) (v128.store64_lane 0 (local.get $0) (local.get $1))) + (func (export "i8x16.popcnt") (param $0 v128) (result v128) (i8x16.popcnt (local.get $0))) (func (export "i8x16.abs") (param $0 v128) (result v128) (i8x16.abs (local.get $0))) (func (export "i8x16.neg") (param $0 v128) (result v128) (i8x16.neg (local.get $0))) (func (export "i8x16.any_true") (param $0 v128) (result i32) (i8x16.any_true (local.get $0))) @@ -570,6 +571,9 @@ (assert_return (invoke "v128.load" (i32.const 1024)) (v128.const i32x4 0x04030201 0x08070605 0x00000000 0x00000000)) ;; i8x16 arithmetic +(assert_return (invoke "i8x16.popcnt" (v128.const i8x16 0 1 42 -3 -56 127 -128 -126 0 -1 -42 3 56 -127 -128 126)) + (v128.const i8x16 0 1 3 7 3 7 1 2 0 8 5 2 3 2 1 6) +) (assert_return (invoke "i8x16.abs" (v128.const i8x16 0 1 42 -3 -56 127 -128 -126 0 -1 -42 3 56 -127 -128 126)) (v128.const i8x16 0 1 42 3 56 127 -128 126 0 1 42 3 56 127 -128 126) ) |