summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/binaryen-c.cpp6
-rw-r--r--src/binaryen-c.h6
-rw-r--r--src/gen-s-parser.inc18
-rw-r--r--src/ir/cost.h6
-rw-r--r--src/js/binaryen.js-post.js24
-rw-r--r--src/literal.h6
-rw-r--r--src/passes/Print.cpp18
-rw-r--r--src/wasm-binary.h6
-rw-r--r--src/wasm-interpreter.h12
-rw-r--r--src/wasm.h6
-rw-r--r--src/wasm/literal.cpp34
-rw-r--r--src/wasm/wasm-binary.cpp24
-rw-r--r--src/wasm/wasm-stack.cpp21
-rw-r--r--src/wasm/wasm-validator.cpp17
-rw-r--r--src/wasm/wasm.cpp12
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;