summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Lively <7121787+tlively@users.noreply.github.com>2020-10-27 08:58:36 -0700
committerGitHub <noreply@github.com>2020-10-27 08:58:36 -0700
commitca16f7cdc57549333474d7042128d2007bc35fad (patch)
treec42bffa8027099b9d4f5cb6c2283571bd06950c5
parent91ac3be4364e6f9763d6ccff35c83fab0692ef5c (diff)
downloadbinaryen-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-xscripts/gen-s-parser.py1
-rw-r--r--src/binaryen-c.h1
-rw-r--r--src/gen-s-parser.inc3
-rw-r--r--src/ir/cost.h1
-rw-r--r--src/literal.h1
-rw-r--r--src/passes/Print.cpp3
-rw-r--r--src/tools/fuzzing.h1
-rw-r--r--src/wasm-binary.h2
-rw-r--r--src/wasm-interpreter.h2
-rw-r--r--src/wasm.h1
-rw-r--r--src/wasm/literal.cpp3
-rw-r--r--src/wasm/wasm-binary.cpp4
-rw-r--r--src/wasm/wasm-stack.cpp4
-rw-r--r--src/wasm/wasm-validator.cpp1
-rw-r--r--src/wasm/wasm.cpp1
-rw-r--r--test/example/c-api-kitchen-sink.c16
-rw-r--r--test/example/c-api-kitchen-sink.txt24
-rw-r--r--test/simd.wast5
-rw-r--r--test/simd.wast.from-wast5
-rw-r--r--test/simd.wast.fromBinary5
-rw-r--r--test/simd.wast.fromBinary.noDebugInfo267
-rw-r--r--test/spec/simd.wast4
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)
)