diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/binaryen-c.cpp | 6 | ||||
-rw-r--r-- | src/binaryen-c.h | 6 | ||||
-rw-r--r-- | src/gen-s-parser.inc | 18 | ||||
-rw-r--r-- | src/ir/cost.h | 6 | ||||
-rw-r--r-- | src/js/binaryen.js-post.js | 24 | ||||
-rw-r--r-- | src/literal.h | 6 | ||||
-rw-r--r-- | src/passes/Print.cpp | 18 | ||||
-rw-r--r-- | src/wasm-binary.h | 6 | ||||
-rw-r--r-- | src/wasm-interpreter.h | 12 | ||||
-rw-r--r-- | src/wasm.h | 6 | ||||
-rw-r--r-- | src/wasm/literal.cpp | 34 | ||||
-rw-r--r-- | src/wasm/wasm-binary.cpp | 24 | ||||
-rw-r--r-- | src/wasm/wasm-stack.cpp | 21 | ||||
-rw-r--r-- | src/wasm/wasm-validator.cpp | 17 | ||||
-rw-r--r-- | src/wasm/wasm.cpp | 12 |
15 files changed, 204 insertions, 12 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index 79202eeaa..97565688a 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -790,9 +790,11 @@ BinaryenOp BinaryenOrVec128(void) { return OrVec128; } BinaryenOp BinaryenXorVec128(void) { return XorVec128; } BinaryenOp BinaryenAndNotVec128(void) { return AndNotVec128; } BinaryenOp BinaryenBitselectVec128(void) { return Bitselect; } +BinaryenOp BinaryenAbsVecI8x16(void) { return AbsVecI8x16; } BinaryenOp BinaryenNegVecI8x16(void) { return NegVecI8x16; } BinaryenOp BinaryenAnyTrueVecI8x16(void) { return AnyTrueVecI8x16; } BinaryenOp BinaryenAllTrueVecI8x16(void) { return AllTrueVecI8x16; } +BinaryenOp BinaryenBitmaskVecI8x16(void) { return BitmaskVecI8x16; } BinaryenOp BinaryenShlVecI8x16(void) { return ShlVecI8x16; } BinaryenOp BinaryenShrSVecI8x16(void) { return ShrSVecI8x16; } BinaryenOp BinaryenShrUVecI8x16(void) { return ShrUVecI8x16; } @@ -808,9 +810,11 @@ BinaryenOp BinaryenMinUVecI8x16(void) { return MinUVecI8x16; } BinaryenOp BinaryenMaxSVecI8x16(void) { return MaxSVecI8x16; } BinaryenOp BinaryenMaxUVecI8x16(void) { return MaxUVecI8x16; } BinaryenOp BinaryenAvgrUVecI8x16(void) { return AvgrUVecI8x16; } +BinaryenOp BinaryenAbsVecI16x8(void) { return AbsVecI16x8; } BinaryenOp BinaryenNegVecI16x8(void) { return NegVecI16x8; } BinaryenOp BinaryenAnyTrueVecI16x8(void) { return AnyTrueVecI16x8; } BinaryenOp BinaryenAllTrueVecI16x8(void) { return AllTrueVecI16x8; } +BinaryenOp BinaryenBitmaskVecI16x8(void) { return BitmaskVecI16x8; } BinaryenOp BinaryenShlVecI16x8(void) { return ShlVecI16x8; } BinaryenOp BinaryenShrSVecI16x8(void) { return ShrSVecI16x8; } BinaryenOp BinaryenShrUVecI16x8(void) { return ShrUVecI16x8; } @@ -826,9 +830,11 @@ BinaryenOp BinaryenMinUVecI16x8(void) { return MinUVecI16x8; } BinaryenOp BinaryenMaxSVecI16x8(void) { return MaxSVecI16x8; } BinaryenOp BinaryenMaxUVecI16x8(void) { return MaxUVecI16x8; } BinaryenOp BinaryenAvgrUVecI16x8(void) { return AvgrUVecI16x8; } +BinaryenOp BinaryenAbsVecI32x4(void) { return AbsVecI32x4; } BinaryenOp BinaryenNegVecI32x4(void) { return NegVecI32x4; } BinaryenOp BinaryenAnyTrueVecI32x4(void) { return AnyTrueVecI32x4; } BinaryenOp BinaryenAllTrueVecI32x4(void) { return AllTrueVecI32x4; } +BinaryenOp BinaryenBitmaskVecI32x4(void) { return BitmaskVecI32x4; } BinaryenOp BinaryenShlVecI32x4(void) { return ShlVecI32x4; } BinaryenOp BinaryenShrSVecI32x4(void) { return ShrSVecI32x4; } BinaryenOp BinaryenShrUVecI32x4(void) { return ShrUVecI32x4; } diff --git a/src/binaryen-c.h b/src/binaryen-c.h index 443df5623..b820bbdcb 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -464,9 +464,11 @@ BINARYEN_API BinaryenOp BinaryenOrVec128(void); BINARYEN_API BinaryenOp BinaryenXorVec128(void); BINARYEN_API BinaryenOp BinaryenAndNotVec128(void); BINARYEN_API BinaryenOp BinaryenBitselectVec128(void); +BINARYEN_API BinaryenOp BinaryenAbsVecI8x16(void); BINARYEN_API BinaryenOp BinaryenNegVecI8x16(void); BINARYEN_API BinaryenOp BinaryenAnyTrueVecI8x16(void); BINARYEN_API BinaryenOp BinaryenAllTrueVecI8x16(void); +BINARYEN_API BinaryenOp BinaryenBitmaskVecI8x16(void); BINARYEN_API BinaryenOp BinaryenShlVecI8x16(void); BINARYEN_API BinaryenOp BinaryenShrSVecI8x16(void); BINARYEN_API BinaryenOp BinaryenShrUVecI8x16(void); @@ -482,9 +484,11 @@ BINARYEN_API BinaryenOp BinaryenMinUVecI8x16(void); BINARYEN_API BinaryenOp BinaryenMaxSVecI8x16(void); BINARYEN_API BinaryenOp BinaryenMaxUVecI8x16(void); BINARYEN_API BinaryenOp BinaryenAvgrUVecI8x16(void); +BINARYEN_API BinaryenOp BinaryenAbsVecI16x8(void); BINARYEN_API BinaryenOp BinaryenNegVecI16x8(void); BINARYEN_API BinaryenOp BinaryenAnyTrueVecI16x8(void); BINARYEN_API BinaryenOp BinaryenAllTrueVecI16x8(void); +BINARYEN_API BinaryenOp BinaryenBitmaskVecI16x8(void); BINARYEN_API BinaryenOp BinaryenShlVecI16x8(void); BINARYEN_API BinaryenOp BinaryenShrSVecI16x8(void); BINARYEN_API BinaryenOp BinaryenShrUVecI16x8(void); @@ -500,9 +504,11 @@ BINARYEN_API BinaryenOp BinaryenMinUVecI16x8(void); BINARYEN_API BinaryenOp BinaryenMaxSVecI16x8(void); BINARYEN_API BinaryenOp BinaryenMaxUVecI16x8(void); BINARYEN_API BinaryenOp BinaryenAvgrUVecI16x8(void); +BINARYEN_API BinaryenOp BinaryenAbsVecI32x4(void); BINARYEN_API BinaryenOp BinaryenNegVecI32x4(void); BINARYEN_API BinaryenOp BinaryenAnyTrueVecI32x4(void); BINARYEN_API BinaryenOp BinaryenAllTrueVecI32x4(void); +BINARYEN_API BinaryenOp BinaryenBitmaskVecI32x4(void); BINARYEN_API BinaryenOp BinaryenShlVecI32x4(void); BINARYEN_API BinaryenOp BinaryenShrSVecI32x4(void); BINARYEN_API BinaryenOp BinaryenShrUVecI32x4(void); diff --git a/src/gen-s-parser.inc b/src/gen-s-parser.inc index f1fd55321..09a5070b9 100644 --- a/src/gen-s-parser.inc +++ b/src/gen-s-parser.inc @@ -676,6 +676,9 @@ switch (op[0]) { switch (op[6]) { case 'a': { switch (op[7]) { + case 'b': + if (strcmp(op, "i16x8.abs") == 0) { return makeUnary(s, UnaryOp::AbsVecI16x8); } + goto parse_error; case 'd': { switch (op[9]) { case '\0': @@ -707,6 +710,9 @@ switch (op[0]) { default: goto parse_error; } } + case 'b': + if (strcmp(op, "i16x8.bitmask") == 0) { return makeUnary(s, UnaryOp::BitmaskVecI16x8); } + goto parse_error; case 'e': { switch (op[7]) { case 'q': @@ -1395,6 +1401,9 @@ switch (op[0]) { switch (op[6]) { case 'a': { switch (op[7]) { + case 'b': + if (strcmp(op, "i32x4.abs") == 0) { return makeUnary(s, UnaryOp::AbsVecI32x4); } + goto parse_error; case 'd': if (strcmp(op, "i32x4.add") == 0) { return makeBinary(s, BinaryOp::AddVecI32x4); } goto parse_error; @@ -1407,6 +1416,9 @@ switch (op[0]) { default: goto parse_error; } } + case 'b': + if (strcmp(op, "i32x4.bitmask") == 0) { return makeUnary(s, UnaryOp::BitmaskVecI32x4); } + goto parse_error; case 'd': if (strcmp(op, "i32x4.dot_i16x8_s") == 0) { return makeBinary(s, BinaryOp::DotSVecI16x8ToVecI32x4); } goto parse_error; @@ -2222,6 +2234,9 @@ switch (op[0]) { switch (op[6]) { case 'a': { switch (op[7]) { + case 'b': + if (strcmp(op, "i8x16.abs") == 0) { return makeUnary(s, UnaryOp::AbsVecI8x16); } + goto parse_error; case 'd': { switch (op[9]) { case '\0': @@ -2253,6 +2268,9 @@ switch (op[0]) { default: goto parse_error; } } + case 'b': + if (strcmp(op, "i8x16.bitmask") == 0) { return makeUnary(s, UnaryOp::BitmaskVecI8x16); } + goto parse_error; case 'e': { switch (op[7]) { case 'q': diff --git a/src/ir/cost.h b/src/ir/cost.h index e89fb9d17..2c503da02 100644 --- a/src/ir/cost.h +++ b/src/ir/cost.h @@ -152,15 +152,21 @@ struct CostAnalyzer : public Visitor<CostAnalyzer, Index> { case SplatVecF32x4: case SplatVecF64x2: case NotVec128: + case AbsVecI8x16: case NegVecI8x16: case AnyTrueVecI8x16: case AllTrueVecI8x16: + case BitmaskVecI8x16: + case AbsVecI16x8: case NegVecI16x8: case AnyTrueVecI16x8: case AllTrueVecI16x8: + case BitmaskVecI16x8: + case AbsVecI32x4: case NegVecI32x4: case AnyTrueVecI32x4: case AllTrueVecI32x4: + case BitmaskVecI32x4: case NegVecI64x2: case AnyTrueVecI64x2: case AllTrueVecI64x2: diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js index 39e23633b..49b02d336 100644 --- a/src/js/binaryen.js-post.js +++ b/src/js/binaryen.js-post.js @@ -344,9 +344,11 @@ function initializeConstants() { 'XorVec128', 'AndNotVec128', 'BitselectVec128', + 'AbsVecI8x16', 'NegVecI8x16', 'AnyTrueVecI8x16', 'AllTrueVecI8x16', + 'BitmaskVecI8x16', 'ShlVecI8x16', 'ShrSVecI8x16', 'ShrUVecI8x16', @@ -362,9 +364,11 @@ function initializeConstants() { 'MaxSVecI8x16', 'MaxUVecI8x16', 'AvgrUVecI8x16', + 'AbsVecI16x8', 'NegVecI16x8', 'AnyTrueVecI16x8', 'AllTrueVecI16x8', + 'BitmaskVecI16x8', 'ShlVecI16x8', 'ShrSVecI16x8', 'ShrUVecI16x8', @@ -381,9 +385,11 @@ function initializeConstants() { 'MaxUVecI16x8', 'AvgrUVecI16x8', 'DotSVecI16x8ToVecI32x4', + 'AbsVecI32x4', 'NegVecI32x4', 'AnyTrueVecI32x4', 'AllTrueVecI32x4', + 'BitmaskVecI32x4', 'ShlVecI32x4', 'ShrSVecI32x4', 'ShrUVecI32x4', @@ -1466,6 +1472,9 @@ function wrapModule(module, self) { 'ge_u': function(left, right) { return Module['_BinaryenBinary'](module, Module['GeUVecI8x16'], left, right); }, + 'abs': function(value) { + return Module['_BinaryenUnary'](module, Module['AbsVecI8x16'], value); + }, 'neg': function(value) { return Module['_BinaryenUnary'](module, Module['NegVecI8x16'], value); }, @@ -1475,6 +1484,9 @@ function wrapModule(module, self) { 'all_true': function(value) { return Module['_BinaryenUnary'](module, Module['AllTrueVecI8x16'], value); }, + 'bitmask': function(value) { + return Module['_BinaryenUnary'](module, Module['BitmaskVecI8x16'], value); + }, 'shl': function(vec, shift) { return Module['_BinaryenSIMDShift'](module, Module['ShlVecI8x16'], vec, shift); }, @@ -1571,6 +1583,9 @@ function wrapModule(module, self) { 'ge_u': function(left, right) { return Module['_BinaryenBinary'](module, Module['GeUVecI16x8'], left, right); }, + 'abs': function(value) { + return Module['_BinaryenUnary'](module, Module['AbsVecI16x8'], value); + }, 'neg': function(value) { return Module['_BinaryenUnary'](module, Module['NegVecI16x8'], value); }, @@ -1580,6 +1595,9 @@ function wrapModule(module, self) { 'all_true': function(value) { return Module['_BinaryenUnary'](module, Module['AllTrueVecI16x8'], value); }, + 'bitmask': function(value) { + return Module['_BinaryenUnary'](module, Module['BitmaskVecI16x8'], value); + }, 'shl': function(vec, shift) { return Module['_BinaryenSIMDShift'](module, Module['ShlVecI16x8'], vec, shift); }, @@ -1691,6 +1709,9 @@ function wrapModule(module, self) { 'ge_u': function(left, right) { return Module['_BinaryenBinary'](module, Module['GeUVecI32x4'], left, right); }, + 'abs': function(value) { + return Module['_BinaryenUnary'](module, Module['AbsVecI32x4'], value); + }, 'neg': function(value) { return Module['_BinaryenUnary'](module, Module['NegVecI32x4'], value); }, @@ -1700,6 +1721,9 @@ function wrapModule(module, self) { 'all_true': function(value) { return Module['_BinaryenUnary'](module, Module['AllTrueVecI32x4'], value); }, + 'bitmask': function(value) { + return Module['_BinaryenUnary'](module, Module['BitmaskVecI32x4'], value); + }, 'shl': function(vec, shift) { return Module['_BinaryenSIMDShift'](module, Module['ShlVecI32x4'], vec, shift); }, diff --git a/src/literal.h b/src/literal.h index df087214a..652f80bdc 100644 --- a/src/literal.h +++ b/src/literal.h @@ -330,9 +330,11 @@ public: Literal orV128(const Literal& other) const; Literal xorV128(const Literal& other) const; Literal bitselectV128(const Literal& left, const Literal& right) const; + Literal absI8x16() const; Literal negI8x16() const; Literal anyTrueI8x16() const; Literal allTrueI8x16() const; + Literal bitmaskI8x16() const; Literal shlI8x16(const Literal& other) const; Literal shrSI8x16(const Literal& other) const; Literal shrUI8x16(const Literal& other) const; @@ -348,9 +350,11 @@ public: Literal maxSI8x16(const Literal& other) const; Literal maxUI8x16(const Literal& other) const; Literal avgrUI8x16(const Literal& other) const; + Literal absI16x8() const; Literal negI16x8() const; Literal anyTrueI16x8() const; Literal allTrueI16x8() const; + Literal bitmaskI16x8() const; Literal shlI16x8(const Literal& other) const; Literal shrSI16x8(const Literal& other) const; Literal shrUI16x8(const Literal& other) const; @@ -366,9 +370,11 @@ public: Literal maxSI16x8(const Literal& other) const; Literal maxUI16x8(const Literal& other) const; Literal avgrUI16x8(const Literal& other) const; + Literal absI32x4() const; Literal negI32x4() const; Literal anyTrueI32x4() const; Literal allTrueI32x4() const; + Literal bitmaskI32x4() const; Literal shlI32x4(const Literal& other) const; Literal shrSI32x4(const Literal& other) const; Literal shrUI32x4(const Literal& other) const; diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp index 2a483efd3..daa7e7ac6 100644 --- a/src/passes/Print.cpp +++ b/src/passes/Print.cpp @@ -717,6 +717,9 @@ struct PrintExpressionContents case NotVec128: o << "v128.not"; break; + case AbsVecI8x16: + o << "i8x16.abs"; + break; case NegVecI8x16: o << "i8x16.neg"; break; @@ -726,6 +729,12 @@ struct PrintExpressionContents case AllTrueVecI8x16: o << "i8x16.all_true"; break; + case BitmaskVecI8x16: + o << "i8x16.bitmask"; + break; + case AbsVecI16x8: + o << "i16x8.abs"; + break; case NegVecI16x8: o << "i16x8.neg"; break; @@ -735,6 +744,12 @@ struct PrintExpressionContents case AllTrueVecI16x8: o << "i16x8.all_true"; break; + case BitmaskVecI16x8: + o << "i16x8.bitmask"; + break; + case AbsVecI32x4: + o << "i32x4.abs"; + break; case NegVecI32x4: o << "i32x4.neg"; break; @@ -744,6 +759,9 @@ struct PrintExpressionContents case AllTrueVecI32x4: o << "i32x4.all_true"; break; + case BitmaskVecI32x4: + o << "i32x4.bitmask"; + break; case NegVecI64x2: o << "i64x2.neg"; break; diff --git a/src/wasm-binary.h b/src/wasm-binary.h index 67211ea7d..a90d5fb5f 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -752,9 +752,11 @@ enum ASTNodes { V128Xor = 0x4f, V128AndNot = 0xd8, V128Bitselect = 0x50, + I8x16Abs = 0xe1, I8x16Neg = 0x51, I8x16AnyTrue = 0x52, I8x16AllTrue = 0x53, + I8x16Bitmask = 0xe4, I8x16Shl = 0x54, I8x16ShrS = 0x55, I8x16ShrU = 0x56, @@ -770,9 +772,11 @@ enum ASTNodes { I8x16MaxS = 0x60, I8x16MaxU = 0x61, I8x16AvgrU = 0xd9, + I16x8Abs = 0xe2, I16x8Neg = 0x62, I16x8AnyTrue = 0x63, I16x8AllTrue = 0x64, + I16x8Bitmask = 0xe5, I16x8Shl = 0x65, I16x8ShrS = 0x66, I16x8ShrU = 0x67, @@ -788,9 +792,11 @@ enum ASTNodes { I16x8MaxS = 0x71, I16x8MaxU = 0x72, I16x8AvgrU = 0xda, + I32x4Abs = 0xe3, I32x4Neg = 0x73, I32x4AnyTrue = 0x74, I32x4AllTrue = 0x75, + I32x4Bitmask = 0xe6, I32x4Shl = 0x76, I32x4ShrS = 0x77, I32x4ShrU = 0x78, diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 357cc3979..4765efa0e 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -435,24 +435,36 @@ public: return value.splatF64x2(); case NotVec128: return value.notV128(); + case AbsVecI8x16: + return value.absI8x16(); case NegVecI8x16: return value.negI8x16(); case AnyTrueVecI8x16: return value.anyTrueI8x16(); case AllTrueVecI8x16: return value.allTrueI8x16(); + case BitmaskVecI8x16: + return value.bitmaskI8x16(); + case AbsVecI16x8: + return value.absI16x8(); case NegVecI16x8: return value.negI16x8(); case AnyTrueVecI16x8: return value.anyTrueI16x8(); case AllTrueVecI16x8: return value.allTrueI16x8(); + case BitmaskVecI16x8: + return value.bitmaskI16x8(); + case AbsVecI32x4: + return value.absI32x4(); case NegVecI32x4: return value.negI32x4(); case AnyTrueVecI32x4: return value.anyTrueI32x4(); case AllTrueVecI32x4: return value.allTrueI32x4(); + case BitmaskVecI32x4: + return value.bitmaskI32x4(); case NegVecI64x2: return value.negI64x2(); case AnyTrueVecI64x2: diff --git a/src/wasm.h b/src/wasm.h index a89353de6..21fef1049 100644 --- a/src/wasm.h +++ b/src/wasm.h @@ -156,15 +156,21 @@ enum UnaryOp { // SIMD arithmetic NotVec128, + AbsVecI8x16, NegVecI8x16, AnyTrueVecI8x16, AllTrueVecI8x16, + BitmaskVecI8x16, + AbsVecI16x8, NegVecI16x8, AnyTrueVecI16x8, AllTrueVecI16x8, + BitmaskVecI16x8, + AbsVecI32x4, NegVecI32x4, AnyTrueVecI32x4, AllTrueVecI32x4, + BitmaskVecI32x4, NegVecI64x2, AnyTrueVecI64x2, AllTrueVecI64x2, diff --git a/src/wasm/literal.cpp b/src/wasm/literal.cpp index aa2acdcc1..b740ae520 100644 --- a/src/wasm/literal.cpp +++ b/src/wasm/literal.cpp @@ -565,9 +565,9 @@ Literal Literal::neg() const { Literal Literal::abs() const { switch (type.getSingle()) { case Type::i32: - return Literal(i32 & 0x7fffffff); + return Literal(std::abs(i32)); case Type::i64: - return Literal(int64_t(i64 & 0x7fffffffffffffffULL)); + return Literal(std::abs(i64)); case Type::f32: return Literal(i32 & 0x7fffffff).castToF32(); case Type::f64: @@ -1442,6 +1442,15 @@ Literal Literal::notV128() const { ones.fill(0xff); return xorV128(Literal(ones.data())); } +Literal Literal::absI8x16() const { + return unary<16, &Literal::getLanesSI8x16, &Literal::abs>(*this); +} +Literal Literal::absI16x8() const { + return unary<8, &Literal::getLanesSI16x8, &Literal::abs>(*this); +} +Literal Literal::absI32x4() const { + return unary<4, &Literal::getLanesI32x4, &Literal::abs>(*this); +} Literal Literal::negI8x16() const { return unary<16, &Literal::getLanesUI8x16, &Literal::neg>(*this); } @@ -1519,24 +1528,45 @@ static Literal all_true(const Literal& val) { return Literal(int32_t(1)); } +template<int Lanes, LaneArray<Lanes> (Literal::*IntoLanes)() const> +static Literal bitmask(const Literal& val) { + uint32_t result = 0; + LaneArray<Lanes> lanes = (val.*IntoLanes)(); + for (size_t i = 0; i < Lanes; ++i) { + if (lanes[i].geti32() & (1 << 31)) { + result = result | (1 << i); + } + } + return Literal(result); +} + Literal Literal::anyTrueI8x16() const { return any_true<16, &Literal::getLanesUI8x16>(*this); } Literal Literal::allTrueI8x16() const { return all_true<16, &Literal::getLanesUI8x16>(*this); } +Literal Literal::bitmaskI8x16() const { + return bitmask<16, &Literal::getLanesSI8x16>(*this); +} Literal Literal::anyTrueI16x8() const { return any_true<8, &Literal::getLanesUI16x8>(*this); } Literal Literal::allTrueI16x8() const { return all_true<8, &Literal::getLanesUI16x8>(*this); } +Literal Literal::bitmaskI16x8() const { + return bitmask<8, &Literal::getLanesSI16x8>(*this); +} Literal Literal::anyTrueI32x4() const { return any_true<4, &Literal::getLanesI32x4>(*this); } Literal Literal::allTrueI32x4() const { return all_true<4, &Literal::getLanesI32x4>(*this); } +Literal Literal::bitmaskI32x4() const { + return bitmask<4, &Literal::getLanesI32x4>(*this); +} Literal Literal::anyTrueI64x2() const { return any_true<2, &Literal::getLanesI64x2>(*this); } diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 9fe046c27..dbd644a17 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -4053,6 +4053,10 @@ bool WasmBinaryBuilder::maybeVisitSIMDUnary(Expression*& out, uint32_t code) { curr = allocator.alloc<Unary>(); curr->op = NotVec128; break; + case BinaryConsts::I8x16Abs: + curr = allocator.alloc<Unary>(); + curr->op = AbsVecI8x16; + break; case BinaryConsts::I8x16Neg: curr = allocator.alloc<Unary>(); curr->op = NegVecI8x16; @@ -4065,6 +4069,14 @@ bool WasmBinaryBuilder::maybeVisitSIMDUnary(Expression*& out, uint32_t code) { curr = allocator.alloc<Unary>(); curr->op = AllTrueVecI8x16; break; + case BinaryConsts::I8x16Bitmask: + curr = allocator.alloc<Unary>(); + curr->op = BitmaskVecI8x16; + break; + case BinaryConsts::I16x8Abs: + curr = allocator.alloc<Unary>(); + curr->op = AbsVecI16x8; + break; case BinaryConsts::I16x8Neg: curr = allocator.alloc<Unary>(); curr->op = NegVecI16x8; @@ -4077,6 +4089,14 @@ bool WasmBinaryBuilder::maybeVisitSIMDUnary(Expression*& out, uint32_t code) { curr = allocator.alloc<Unary>(); curr->op = AllTrueVecI16x8; break; + case BinaryConsts::I16x8Bitmask: + curr = allocator.alloc<Unary>(); + curr->op = BitmaskVecI16x8; + break; + case BinaryConsts::I32x4Abs: + curr = allocator.alloc<Unary>(); + curr->op = AbsVecI32x4; + break; case BinaryConsts::I32x4Neg: curr = allocator.alloc<Unary>(); curr->op = NegVecI32x4; @@ -4089,6 +4109,10 @@ bool WasmBinaryBuilder::maybeVisitSIMDUnary(Expression*& out, uint32_t code) { curr = allocator.alloc<Unary>(); curr->op = AllTrueVecI32x4; break; + case BinaryConsts::I32x4Bitmask: + curr = allocator.alloc<Unary>(); + curr->op = BitmaskVecI32x4; + break; case BinaryConsts::I64x2Neg: curr = allocator.alloc<Unary>(); curr->op = NegVecI64x2; diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp index 3c162a9d5..9b5dc3f22 100644 --- a/src/wasm/wasm-stack.cpp +++ b/src/wasm/wasm-stack.cpp @@ -899,6 +899,9 @@ void BinaryInstWriter::visitUnary(Unary* curr) { case NotVec128: o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::V128Not); break; + case AbsVecI8x16: + o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I8x16Abs); + break; case NegVecI8x16: o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I8x16Neg); break; @@ -910,6 +913,13 @@ void BinaryInstWriter::visitUnary(Unary* curr) { o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I8x16AllTrue); break; + case BitmaskVecI8x16: + o << int8_t(BinaryConsts::SIMDPrefix) + << U32LEB(BinaryConsts::I8x16Bitmask); + break; + case AbsVecI16x8: + o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I16x8Abs); + break; case NegVecI16x8: o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I16x8Neg); break; @@ -921,6 +931,13 @@ void BinaryInstWriter::visitUnary(Unary* curr) { o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I16x8AllTrue); break; + case BitmaskVecI16x8: + o << int8_t(BinaryConsts::SIMDPrefix) + << U32LEB(BinaryConsts::I16x8Bitmask); + break; + case AbsVecI32x4: + o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I32x4Abs); + break; case NegVecI32x4: o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I32x4Neg); break; @@ -932,6 +949,10 @@ void BinaryInstWriter::visitUnary(Unary* curr) { o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I32x4AllTrue); break; + case BitmaskVecI32x4: + o << int8_t(BinaryConsts::SIMDPrefix) + << U32LEB(BinaryConsts::I32x4Bitmask); + break; case NegVecI64x2: o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I64x2Neg); break; diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp index 1db8ed7c0..984c25b3f 100644 --- a/src/wasm/wasm-validator.cpp +++ b/src/wasm/wasm-validator.cpp @@ -1689,6 +1689,9 @@ void FunctionValidator::visitUnary(Unary* curr) { curr->value->type, Type(Type::f64), curr, "expected f64 splat value"); break; case NotVec128: + case AbsVecI8x16: + case AbsVecI16x8: + case AbsVecI32x4: case NegVecI8x16: case NegVecI16x8: case NegVecI32x4: @@ -1720,17 +1723,17 @@ void FunctionValidator::visitUnary(Unary* curr) { curr->value->type, Type(Type::v128), curr, "expected v128 operand"); break; case AnyTrueVecI8x16: - case AllTrueVecI8x16: case AnyTrueVecI16x8: - case AllTrueVecI16x8: case AnyTrueVecI32x4: - case AllTrueVecI32x4: case AnyTrueVecI64x2: + case AllTrueVecI8x16: + case AllTrueVecI16x8: + case AllTrueVecI32x4: case AllTrueVecI64x2: - shouldBeEqual(curr->type, - Type(Type::i32), - curr, - "expected boolean reduction to have i32 type"); + case BitmaskVecI8x16: + case BitmaskVecI16x8: + case BitmaskVecI32x4: + shouldBeEqual(curr->type, Type(Type::i32), curr, "expected i32 type"); shouldBeEqual( curr->value->type, Type(Type::v128), curr, "expected v128 operand"); break; diff --git a/src/wasm/wasm.cpp b/src/wasm/wasm.cpp index 35fa8b5c5..6f7ea4f86 100644 --- a/src/wasm/wasm.cpp +++ b/src/wasm/wasm.cpp @@ -737,6 +737,9 @@ void Unary::finalize() { case SplatVecF32x4: case SplatVecF64x2: case NotVec128: + case AbsVecI8x16: + case AbsVecI16x8: + case AbsVecI32x4: case NegVecI8x16: case NegVecI16x8: case NegVecI32x4: @@ -766,13 +769,16 @@ void Unary::finalize() { type = Type::v128; break; case AnyTrueVecI8x16: - case AllTrueVecI8x16: case AnyTrueVecI16x8: - case AllTrueVecI16x8: case AnyTrueVecI32x4: - case AllTrueVecI32x4: case AnyTrueVecI64x2: + case AllTrueVecI8x16: + case AllTrueVecI16x8: + case AllTrueVecI32x4: case AllTrueVecI64x2: + case BitmaskVecI8x16: + case BitmaskVecI16x8: + case BitmaskVecI32x4: type = Type::i32; break; |