summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Lively <7121787+tlively@users.noreply.github.com>2020-05-19 10:17:07 -0700
committerGitHub <noreply@github.com>2020-05-19 10:17:07 -0700
commitfc7346918f8d15ce45639472f00fea5fa8102ff0 (patch)
tree9d6a3e179c69aedbcef4681db2454fe86c65cc3c /src
parent417ccb54ccbb0776148f51cb2869c122826db6d9 (diff)
downloadbinaryen-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.cpp1
-rw-r--r--src/binaryen-c.h1
-rw-r--r--src/gen-s-parser.inc3
-rw-r--r--src/ir/cost.h3
-rw-r--r--src/js/binaryen.js-post.js4
-rw-r--r--src/literal.h1
-rw-r--r--src/passes/Print.cpp3
-rw-r--r--src/wasm-binary.h2
-rw-r--r--src/wasm-interpreter.h2
-rw-r--r--src/wasm.h1
-rw-r--r--src/wasm/literal.cpp3
-rw-r--r--src/wasm/wasm-binary.cpp4
-rw-r--r--src/wasm/wasm-stack.cpp3
-rw-r--r--src/wasm/wasm-validator.cpp1
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: