diff options
author | Thomas Lively <7121787+tlively@users.noreply.github.com> | 2020-05-19 10:17:07 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-19 10:17:07 -0700 |
commit | fc7346918f8d15ce45639472f00fea5fa8102ff0 (patch) | |
tree | 9d6a3e179c69aedbcef4681db2454fe86c65cc3c /src | |
parent | 417ccb54ccbb0776148f51cb2869c122826db6d9 (diff) | |
download | binaryen-fc7346918f8d15ce45639472f00fea5fa8102ff0.tar.gz binaryen-fc7346918f8d15ce45639472f00fea5fa8102ff0.tar.bz2 binaryen-fc7346918f8d15ce45639472f00fea5fa8102ff0.zip |
Implement i64x2.mul (#2860)
This is the only instruction in the current spec proposal that had not
yet been implemnented in the tools.
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 | 3 | ||||
-rw-r--r-- | src/ir/cost.h | 3 | ||||
-rw-r--r-- | src/js/binaryen.js-post.js | 4 | ||||
-rw-r--r-- | src/literal.h | 1 | ||||
-rw-r--r-- | src/passes/Print.cpp | 3 | ||||
-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 | 3 | ||||
-rw-r--r-- | src/wasm/wasm-validator.cpp | 1 |
14 files changed, 31 insertions, 1 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index 5f4ad2c40..be3b651f7 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -670,6 +670,7 @@ BinaryenOp BinaryenShrSVecI64x2(void) { return ShrSVecI64x2; } BinaryenOp BinaryenShrUVecI64x2(void) { return ShrUVecI64x2; } BinaryenOp BinaryenAddVecI64x2(void) { return AddVecI64x2; } BinaryenOp BinaryenSubVecI64x2(void) { return SubVecI64x2; } +BinaryenOp BinaryenMulVecI64x2(void) { return MulVecI64x2; } BinaryenOp BinaryenAbsVecF32x4(void) { return AbsVecF32x4; } BinaryenOp BinaryenNegVecF32x4(void) { return NegVecF32x4; } BinaryenOp BinaryenSqrtVecF32x4(void) { return SqrtVecF32x4; } diff --git a/src/binaryen-c.h b/src/binaryen-c.h index 7a33a4c3c..b21a028ac 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -530,6 +530,7 @@ BINARYEN_API BinaryenOp BinaryenShrSVecI64x2(void); BINARYEN_API BinaryenOp BinaryenShrUVecI64x2(void); BINARYEN_API BinaryenOp BinaryenAddVecI64x2(void); BINARYEN_API BinaryenOp BinaryenSubVecI64x2(void); +BINARYEN_API BinaryenOp BinaryenMulVecI64x2(void); BINARYEN_API BinaryenOp BinaryenAbsVecF32x4(void); BINARYEN_API BinaryenOp BinaryenNegVecF32x4(void); BINARYEN_API BinaryenOp BinaryenSqrtVecF32x4(void); diff --git a/src/gen-s-parser.inc b/src/gen-s-parser.inc index 351a3119f..4c8e991c6 100644 --- a/src/gen-s-parser.inc +++ b/src/gen-s-parser.inc @@ -2199,6 +2199,9 @@ switch (op[0]) { default: goto parse_error; } } + case 'm': + if (strcmp(op, "i64x2.mul") == 0) { return makeBinary(s, BinaryOp::MulVecI64x2); } + goto parse_error; case 'n': if (strcmp(op, "i64x2.neg") == 0) { return makeUnary(s, UnaryOp::NegVecI64x2); } goto parse_error; diff --git a/src/ir/cost.h b/src/ir/cost.h index 8092d4ba2..f890e8910 100644 --- a/src/ir/cost.h +++ b/src/ir/cost.h @@ -669,6 +669,9 @@ struct CostAnalyzer : public Visitor<CostAnalyzer, Index> { case SubVecI64x2: ret = 1; break; + case MulVecI64x2: + ret = 1; + break; case AddVecF32x4: ret = 1; break; diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js index 993f8c129..1902bddfa 100644 --- a/src/js/binaryen.js-post.js +++ b/src/js/binaryen.js-post.js @@ -410,6 +410,7 @@ function initializeConstants() { 'ShrUVecI64x2', 'AddVecI64x2', 'SubVecI64x2', + 'MulVecI64x2', 'AbsVecF32x4', 'NegVecF32x4', 'SqrtVecF32x4', @@ -1833,6 +1834,9 @@ function wrapModule(module, self) { 'sub': function(left, right) { return Module['_BinaryenBinary'](module, Module['SubVecI64x2'], left, right); }, + 'mul': function(left, right) { + return Module['_BinaryenBinary'](module, Module['MulVecI64x2'], left, right); + }, 'trunc_sat_f64x2_s': function(value) { return Module['_BinaryenUnary'](module, Module['TruncSatSVecF64x2ToVecI64x2'], value); }, diff --git a/src/literal.h b/src/literal.h index bba2b24d8..2295a126e 100644 --- a/src/literal.h +++ b/src/literal.h @@ -417,6 +417,7 @@ public: Literal shrUI64x2(const Literal& other) const; Literal addI64x2(const Literal& other) const; Literal subI64x2(const Literal& other) const; + Literal mulI64x2(const Literal& other) const; Literal absF32x4() const; Literal negF32x4() const; Literal sqrtF32x4() const; diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp index 3ed6edcb5..62eac9b06 100644 --- a/src/passes/Print.cpp +++ b/src/passes/Print.cpp @@ -1318,6 +1318,9 @@ struct PrintExpressionContents case SubVecI64x2: o << "i64x2.sub"; break; + case MulVecI64x2: + o << "i64x2.mul"; + break; case AddVecF32x4: o << "f32x4.add"; diff --git a/src/wasm-binary.h b/src/wasm-binary.h index 7a2e33864..995adde2a 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -848,7 +848,7 @@ enum ASTNodes { I64x2ShrU = 0xcd, I64x2Add = 0xce, I64x2Sub = 0xd1, - // TODO: i64x2.mul + I64x2Mul = 0xd5, F32x4Abs = 0xe0, F32x4Neg = 0xe1, diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index b0118231e..56e453b64 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -880,6 +880,8 @@ public: return left.addI64x2(right); case SubVecI64x2: return left.subI64x2(right); + case MulVecI64x2: + return left.mulI64x2(right); case AddVecF32x4: return left.addF32x4(right); diff --git a/src/wasm.h b/src/wasm.h index 81f9f4ba0..c43544cc1 100644 --- a/src/wasm.h +++ b/src/wasm.h @@ -394,6 +394,7 @@ enum BinaryOp { DotSVecI16x8ToVecI32x4, AddVecI64x2, SubVecI64x2, + MulVecI64x2, AddVecF32x4, SubVecF32x4, MulVecF32x4, diff --git a/src/wasm/literal.cpp b/src/wasm/literal.cpp index 5ad82acaf..3326adc74 100644 --- a/src/wasm/literal.cpp +++ b/src/wasm/literal.cpp @@ -1960,6 +1960,9 @@ Literal Literal::addI64x2(const Literal& other) const { Literal Literal::subI64x2(const Literal& other) const { return binary<2, &Literal::getLanesI64x2, &Literal::sub>(*this, other); } +Literal Literal::mulI64x2(const Literal& other) const { + return binary<2, &Literal::getLanesI64x2, &Literal::mul>(*this, other); +} Literal Literal::addF32x4(const Literal& other) const { return binary<4, &Literal::getLanesF32x4, &Literal::add>(*this, other); } diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index ca9f44700..3441953a7 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -3981,6 +3981,10 @@ bool WasmBinaryBuilder::maybeVisitSIMDBinary(Expression*& out, uint32_t code) { curr = allocator.alloc<Binary>(); curr->op = SubVecI64x2; break; + case BinaryConsts::I64x2Mul: + curr = allocator.alloc<Binary>(); + curr->op = MulVecI64x2; + break; case BinaryConsts::F32x4Add: curr = allocator.alloc<Binary>(); curr->op = AddVecF32x4; diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp index a9415612d..3c5122c10 100644 --- a/src/wasm/wasm-stack.cpp +++ b/src/wasm/wasm-stack.cpp @@ -1542,6 +1542,9 @@ void BinaryInstWriter::visitBinary(Binary* curr) { case SubVecI64x2: o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I64x2Sub); break; + case MulVecI64x2: + o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I64x2Mul); + break; case AddVecF32x4: o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F32x4Add); diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp index f5e134dba..606cb47a8 100644 --- a/src/wasm/wasm-validator.cpp +++ b/src/wasm/wasm-validator.cpp @@ -1449,6 +1449,7 @@ void FunctionValidator::visitBinary(Binary* curr) { case DotSVecI16x8ToVecI32x4: case AddVecI64x2: case SubVecI64x2: + case MulVecI64x2: case AddVecF32x4: case SubVecF32x4: case MulVecF32x4: |