diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/binaryen-c.cpp | 1 | ||||
-rw-r--r-- | src/binaryen-c.h | 1 | ||||
-rw-r--r-- | src/gen-s-parser.inc | 14 | ||||
-rw-r--r-- | src/ir/cost.h | 3 | ||||
-rw-r--r-- | src/js/binaryen.js-post.js | 16 | ||||
-rw-r--r-- | src/passes/Print.cpp | 3 | ||||
-rw-r--r-- | src/tools/fuzzing.h | 1 | ||||
-rw-r--r-- | src/wasm-binary.h | 1 | ||||
-rw-r--r-- | src/wasm-interpreter.h | 2 | ||||
-rw-r--r-- | src/wasm.h | 1 | ||||
-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 |
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: |