diff options
Diffstat (limited to 'src')
-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 |
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: |