summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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
14 files changed, 28 insertions, 0 deletions
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: