summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/binaryen-c.cpp1
-rw-r--r--src/binaryen-c.h1
-rw-r--r--src/gen-s-parser.inc14
-rw-r--r--src/ir/cost.h3
-rw-r--r--src/js/binaryen.js-post.js16
-rw-r--r--src/passes/Print.cpp3
-rw-r--r--src/tools/fuzzing.h1
-rw-r--r--src/wasm-binary.h1
-rw-r--r--src/wasm-interpreter.h2
-rw-r--r--src/wasm.h1
-rw-r--r--src/wasm/wasm-binary.cpp4
-rw-r--r--src/wasm/wasm-stack.cpp4
-rw-r--r--src/wasm/wasm-validator.cpp1
13 files changed, 42 insertions, 10 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index 5a32737e4..23f67874f 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -793,6 +793,7 @@ BinaryenOp BinaryenNotVec128(void) { return NotVec128; }
BinaryenOp BinaryenAndVec128(void) { return AndVec128; }
BinaryenOp BinaryenOrVec128(void) { return OrVec128; }
BinaryenOp BinaryenXorVec128(void) { return XorVec128; }
+BinaryenOp BinaryenAndNotVec128(void) { return AndNotVec128; }
BinaryenOp BinaryenBitselectVec128(void) { return Bitselect; }
BinaryenOp BinaryenNegVecI8x16(void) { return NegVecI8x16; }
BinaryenOp BinaryenAnyTrueVecI8x16(void) { return AnyTrueVecI8x16; }
diff --git a/src/binaryen-c.h b/src/binaryen-c.h
index c4fbb9748..d6531fae0 100644
--- a/src/binaryen-c.h
+++ b/src/binaryen-c.h
@@ -449,6 +449,7 @@ BINARYEN_API BinaryenOp BinaryenNotVec128(void);
BINARYEN_API BinaryenOp BinaryenAndVec128(void);
BINARYEN_API BinaryenOp BinaryenOrVec128(void);
BINARYEN_API BinaryenOp BinaryenXorVec128(void);
+BINARYEN_API BinaryenOp BinaryenAndNotVec128(void);
BINARYEN_API BinaryenOp BinaryenBitselectVec128(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 b1bd5c016..e9da45a18 100644
--- a/src/gen-s-parser.inc
+++ b/src/gen-s-parser.inc
@@ -2421,9 +2421,17 @@ switch (op[0]) {
switch (op[2]) {
case '2': {
switch (op[5]) {
- case 'a':
- if (strcmp(op, "v128.and") == 0) { return makeBinary(s, BinaryOp::AndVec128); }
- goto parse_error;
+ case 'a': {
+ switch (op[8]) {
+ case '\0':
+ if (strcmp(op, "v128.and") == 0) { return makeBinary(s, BinaryOp::AndVec128); }
+ goto parse_error;
+ case 'n':
+ if (strcmp(op, "v128.andnot") == 0) { return makeBinary(s, BinaryOp::AndNotVec128); }
+ goto parse_error;
+ default: goto parse_error;
+ }
+ }
case 'b':
if (strcmp(op, "v128.bitselect") == 0) { return makeSIMDTernary(s, SIMDTernaryOp::Bitselect); }
goto parse_error;
diff --git a/src/ir/cost.h b/src/ir/cost.h
index 9ff5370f7..a4d9a0d40 100644
--- a/src/ir/cost.h
+++ b/src/ir/cost.h
@@ -558,6 +558,9 @@ struct CostAnalyzer : public Visitor<CostAnalyzer, Index> {
case XorVec128:
ret = 1;
break;
+ case AndNotVec128:
+ ret = 1;
+ break;
case AddVecI8x16:
ret = 1;
break;
diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js
index c82aaaf6d..3e1ccd2f8 100644
--- a/src/js/binaryen.js-post.js
+++ b/src/js/binaryen.js-post.js
@@ -321,6 +321,7 @@ Module['NotVec128'] = Module['_BinaryenNotVec128']();
Module['AndVec128'] = Module['_BinaryenAndVec128']();
Module['OrVec128'] = Module['_BinaryenOrVec128']();
Module['XorVec128'] = Module['_BinaryenXorVec128']();
+Module['AndNotVec128'] = Module['_BinaryenAndNotVec128']();
Module['BitselectVec128'] = Module['_BinaryenBitselectVec128']();
Module['NegVecI8x16'] = Module['_BinaryenNegVecI8x16']();
Module['AnyTrueVecI8x16'] = Module['_BinaryenAnyTrueVecI8x16']();
@@ -1335,14 +1336,17 @@ function wrapModule(module, self) {
'not': function(value) {
return Module['_BinaryenUnary'](module, Module['NotVec128'], value);
},
- 'and': function(value) {
- return Module['_BinaryenUnary'](module, Module['AndVec128'], value);
+ 'and': function(left, right) {
+ return Module['_BinaryenBinary'](module, Module['AndVec128'], left, right);
+ },
+ 'or': function(left, right) {
+ return Module['_BinaryenBinary'](module, Module['OrVec128'], left, right);
},
- 'or': function(value) {
- return Module['_BinaryenUnary'](module, Module['OrVec128'], value);
+ 'xor': function(left, right) {
+ return Module['_BinaryenBinary'](module, Module['XorVec128'], left, right);
},
- 'xor': function(value) {
- return Module['_BinaryenUnary'](module, Module['XorVec128'], value);
+ 'andnot': function(left, right) {
+ return Module['_BinaryenBinary'](module, Module['AndNotVec128'], left, right);
},
'bitselect': function(left, right, cond) {
return Module['_BinaryenSIMDTernary'](module, Module['BitselectVec128'], left, right, cond);
diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp
index afdb12444..e73747a4f 100644
--- a/src/passes/Print.cpp
+++ b/src/passes/Print.cpp
@@ -1113,6 +1113,9 @@ struct PrintExpressionContents
case XorVec128:
o << "v128.xor";
break;
+ case AndNotVec128:
+ o << "v128.andnot";
+ break;
case AddVecI8x16:
o << "i8x16.add";
diff --git a/src/tools/fuzzing.h b/src/tools/fuzzing.h
index 2f0c5d315..39cff56d5 100644
--- a/src/tools/fuzzing.h
+++ b/src/tools/fuzzing.h
@@ -2139,6 +2139,7 @@ private:
AndVec128,
OrVec128,
XorVec128,
+ AndNotVec128,
AddVecI8x16,
AddSatSVecI8x16,
AddSatUVecI8x16,
diff --git a/src/wasm-binary.h b/src/wasm-binary.h
index 3cbc1cc6b..8de833a79 100644
--- a/src/wasm-binary.h
+++ b/src/wasm-binary.h
@@ -782,6 +782,7 @@ enum ASTNodes {
V128And = 0x4d,
V128Or = 0x4e,
V128Xor = 0x4f,
+ V128AndNot = 0xd8,
V128Bitselect = 0x50,
I8x16Neg = 0x51,
I8x16AnyTrue = 0x52,
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h
index a128cf6e5..94a3f0d54 100644
--- a/src/wasm-interpreter.h
+++ b/src/wasm-interpreter.h
@@ -740,6 +740,8 @@ public:
return left.orV128(right);
case XorVec128:
return left.xorV128(right);
+ case AndNotVec128:
+ return left.andV128(right.notV128());
case AddVecI8x16:
return left.addI8x16(right);
diff --git a/src/wasm.h b/src/wasm.h
index 735b24163..7aa3ecea3 100644
--- a/src/wasm.h
+++ b/src/wasm.h
@@ -353,6 +353,7 @@ enum BinaryOp {
AndVec128,
OrVec128,
XorVec128,
+ AndNotVec128,
AddVecI8x16,
AddSatSVecI8x16,
AddSatUVecI8x16,
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp
index 136301500..6f10df8f5 100644
--- a/src/wasm/wasm-binary.cpp
+++ b/src/wasm/wasm-binary.cpp
@@ -3819,6 +3819,10 @@ bool WasmBinaryBuilder::maybeVisitSIMDBinary(Expression*& out, uint32_t code) {
curr = allocator.alloc<Binary>();
curr->op = XorVec128;
break;
+ case BinaryConsts::V128AndNot:
+ curr = allocator.alloc<Binary>();
+ curr->op = AndNotVec128;
+ break;
case BinaryConsts::I8x16Add:
curr = allocator.alloc<Binary>();
curr->op = AddVecI8x16;
diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp
index c673a3fb0..cbe5ba881 100644
--- a/src/wasm/wasm-stack.cpp
+++ b/src/wasm/wasm-stack.cpp
@@ -1343,7 +1343,9 @@ void BinaryInstWriter::visitBinary(Binary* curr) {
case XorVec128:
o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::V128Xor);
break;
-
+ case AndNotVec128:
+ o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::V128AndNot);
+ break;
case AddVecI8x16:
o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I8x16Add);
break;
diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp
index 68002e4d2..78c8d3289 100644
--- a/src/wasm/wasm-validator.cpp
+++ b/src/wasm/wasm-validator.cpp
@@ -1315,6 +1315,7 @@ void FunctionValidator::visitBinary(Binary* curr) {
case AndVec128:
case OrVec128:
case XorVec128:
+ case AndNotVec128:
case AddVecI8x16:
case AddSatSVecI8x16:
case AddSatUVecI8x16: