summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xscripts/gen-s-parser.py1
-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
-rw-r--r--test/binaryen.js/kitchen-sink.js1
-rw-r--r--test/binaryen.js/kitchen-sink.js.txt12
-rw-r--r--test/example/c-api-kitchen-sink.c1
-rw-r--r--test/example/c-api-kitchen-sink.txt6
-rw-r--r--test/simd.wast6
-rw-r--r--test/simd.wast.from-wast6
-rw-r--r--test/simd.wast.fromBinary6
-rw-r--r--test/simd.wast.fromBinary.noDebugInfo118
-rw-r--r--test/spec/simd.wast2
24 files changed, 134 insertions, 57 deletions
diff --git a/scripts/gen-s-parser.py b/scripts/gen-s-parser.py
index fe6513de2..b657ea909 100755
--- a/scripts/gen-s-parser.py
+++ b/scripts/gen-s-parser.py
@@ -424,6 +424,7 @@ instructions = [
("i64x2.shr_u", "makeSIMDShift(s, SIMDShiftOp::ShrUVecI64x2)"),
("i64x2.add", "makeBinary(s, BinaryOp::AddVecI64x2)"),
("i64x2.sub", "makeBinary(s, BinaryOp::SubVecI64x2)"),
+ ("i64x2.mul", "makeBinary(s, BinaryOp::MulVecI64x2)"),
("f32x4.abs", "makeUnary(s, UnaryOp::AbsVecF32x4)"),
("f32x4.neg", "makeUnary(s, UnaryOp::NegVecF32x4)"),
("f32x4.sqrt", "makeUnary(s, UnaryOp::SqrtVecF32x4)"),
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:
diff --git a/test/binaryen.js/kitchen-sink.js b/test/binaryen.js/kitchen-sink.js
index 0b693b970..b0b81433d 100644
--- a/test/binaryen.js/kitchen-sink.js
+++ b/test/binaryen.js/kitchen-sink.js
@@ -383,6 +383,7 @@ function test_core() {
module.i32x4.dot_i16x8_s(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
module.i64x2.add(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
module.i64x2.sub(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
+ module.i64x2.mul(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
module.f32x4.add(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
module.f32x4.sub(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
module.f32x4.mul(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
diff --git a/test/binaryen.js/kitchen-sink.js.txt b/test/binaryen.js/kitchen-sink.js.txt
index 0e93201ff..b27d147b3 100644
--- a/test/binaryen.js/kitchen-sink.js.txt
+++ b/test/binaryen.js/kitchen-sink.js.txt
@@ -1244,6 +1244,12 @@ getExpressionInfo(tuple[3])={"id":14,"type":5,"value":3.7}
)
)
(drop
+ (i64x2.mul
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ )
+ )
+ (drop
(f32x4.add
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
@@ -3036,6 +3042,12 @@ getExpressionInfo(tuple[3])={"id":14,"type":5,"value":3.7}
)
)
(drop
+ (i64x2.mul
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ )
+ )
+ (drop
(f32x4.add
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
diff --git a/test/example/c-api-kitchen-sink.c b/test/example/c-api-kitchen-sink.c
index 9b3b68cf7..3ea6c4ef0 100644
--- a/test/example/c-api-kitchen-sink.c
+++ b/test/example/c-api-kitchen-sink.c
@@ -550,6 +550,7 @@ void test_core() {
makeBinary(module, BinaryenMulVecI32x4(), v128),
makeBinary(module, BinaryenAddVecI64x2(), v128),
makeBinary(module, BinaryenSubVecI64x2(), v128),
+ makeBinary(module, BinaryenMulVecI64x2(), v128),
makeBinary(module, BinaryenAddVecF32x4(), v128),
makeBinary(module, BinaryenSubVecF32x4(), v128),
makeBinary(module, BinaryenMulVecF32x4(), v128),
diff --git a/test/example/c-api-kitchen-sink.txt b/test/example/c-api-kitchen-sink.txt
index d3e0281ee..ced13ac72 100644
--- a/test/example/c-api-kitchen-sink.txt
+++ b/test/example/c-api-kitchen-sink.txt
@@ -1147,6 +1147,12 @@ BinaryenFeatureAll: 1023
)
)
(drop
+ (i64x2.mul
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ )
+ )
+ (drop
(f32x4.add
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
diff --git a/test/simd.wast b/test/simd.wast
index fdb6d0309..edd9a2c43 100644
--- a/test/simd.wast
+++ b/test/simd.wast
@@ -790,6 +790,12 @@
(local.get $1)
)
)
+ (func $i64x2.mul (param $0 v128) (param $1 v128) (result v128)
+ (i64x2.mul
+ (local.get $0)
+ (local.get $1)
+ )
+ )
(func $f32x4.add (param $0 v128) (param $1 v128) (result v128)
(f32x4.add
(local.get $0)
diff --git a/test/simd.wast.from-wast b/test/simd.wast.from-wast
index 17b9d7ffd..35643ec04 100644
--- a/test/simd.wast.from-wast
+++ b/test/simd.wast.from-wast
@@ -806,6 +806,12 @@
(local.get $1)
)
)
+ (func $i64x2.mul (param $0 v128) (param $1 v128) (result v128)
+ (i64x2.mul
+ (local.get $0)
+ (local.get $1)
+ )
+ )
(func $f32x4.add (param $0 v128) (param $1 v128) (result v128)
(f32x4.add
(local.get $0)
diff --git a/test/simd.wast.fromBinary b/test/simd.wast.fromBinary
index 8ddfb9a6f..40ce99ec2 100644
--- a/test/simd.wast.fromBinary
+++ b/test/simd.wast.fromBinary
@@ -806,6 +806,12 @@
(local.get $1)
)
)
+ (func $i64x2.mul (param $0 v128) (param $1 v128) (result v128)
+ (i64x2.mul
+ (local.get $0)
+ (local.get $1)
+ )
+ )
(func $f32x4.add (param $0 v128) (param $1 v128) (result v128)
(f32x4.add
(local.get $0)
diff --git a/test/simd.wast.fromBinary.noDebugInfo b/test/simd.wast.fromBinary.noDebugInfo
index 20617d09d..85ca0a9f4 100644
--- a/test/simd.wast.fromBinary.noDebugInfo
+++ b/test/simd.wast.fromBinary.noDebugInfo
@@ -807,314 +807,320 @@
)
)
(func $140 (param $0 v128) (param $1 v128) (result v128)
- (f32x4.add
+ (i64x2.mul
(local.get $0)
(local.get $1)
)
)
(func $141 (param $0 v128) (param $1 v128) (result v128)
- (f32x4.sub
+ (f32x4.add
(local.get $0)
(local.get $1)
)
)
(func $142 (param $0 v128) (param $1 v128) (result v128)
- (f32x4.mul
+ (f32x4.sub
(local.get $0)
(local.get $1)
)
)
(func $143 (param $0 v128) (param $1 v128) (result v128)
- (f32x4.div
+ (f32x4.mul
(local.get $0)
(local.get $1)
)
)
(func $144 (param $0 v128) (param $1 v128) (result v128)
- (f32x4.min
+ (f32x4.div
(local.get $0)
(local.get $1)
)
)
(func $145 (param $0 v128) (param $1 v128) (result v128)
- (f32x4.max
+ (f32x4.min
(local.get $0)
(local.get $1)
)
)
(func $146 (param $0 v128) (param $1 v128) (result v128)
- (f32x4.pmin
+ (f32x4.max
(local.get $0)
(local.get $1)
)
)
(func $147 (param $0 v128) (param $1 v128) (result v128)
+ (f32x4.pmin
+ (local.get $0)
+ (local.get $1)
+ )
+ )
+ (func $148 (param $0 v128) (param $1 v128) (result v128)
(f32x4.pmax
(local.get $0)
(local.get $1)
)
)
- (func $148 (param $0 v128) (result v128)
+ (func $149 (param $0 v128) (result v128)
(f32x4.abs
(local.get $0)
)
)
- (func $149 (param $0 v128) (result v128)
+ (func $150 (param $0 v128) (result v128)
(f32x4.neg
(local.get $0)
)
)
- (func $150 (param $0 v128) (result v128)
+ (func $151 (param $0 v128) (result v128)
(f32x4.sqrt
(local.get $0)
)
)
- (func $151 (param $0 v128) (param $1 v128) (param $2 v128) (result v128)
+ (func $152 (param $0 v128) (param $1 v128) (param $2 v128) (result v128)
(f32x4.qfma
(local.get $0)
(local.get $1)
(local.get $2)
)
)
- (func $152 (param $0 v128) (param $1 v128) (param $2 v128) (result v128)
+ (func $153 (param $0 v128) (param $1 v128) (param $2 v128) (result v128)
(f32x4.qfms
(local.get $0)
(local.get $1)
(local.get $2)
)
)
- (func $153 (param $0 v128) (param $1 v128) (result v128)
+ (func $154 (param $0 v128) (param $1 v128) (result v128)
(f64x2.add
(local.get $0)
(local.get $1)
)
)
- (func $154 (param $0 v128) (param $1 v128) (result v128)
+ (func $155 (param $0 v128) (param $1 v128) (result v128)
(f64x2.sub
(local.get $0)
(local.get $1)
)
)
- (func $155 (param $0 v128) (param $1 v128) (result v128)
+ (func $156 (param $0 v128) (param $1 v128) (result v128)
(f64x2.mul
(local.get $0)
(local.get $1)
)
)
- (func $156 (param $0 v128) (param $1 v128) (result v128)
+ (func $157 (param $0 v128) (param $1 v128) (result v128)
(f64x2.div
(local.get $0)
(local.get $1)
)
)
- (func $157 (param $0 v128) (param $1 v128) (result v128)
+ (func $158 (param $0 v128) (param $1 v128) (result v128)
(f64x2.min
(local.get $0)
(local.get $1)
)
)
- (func $158 (param $0 v128) (param $1 v128) (result v128)
+ (func $159 (param $0 v128) (param $1 v128) (result v128)
(f64x2.max
(local.get $0)
(local.get $1)
)
)
- (func $159 (param $0 v128) (param $1 v128) (result v128)
+ (func $160 (param $0 v128) (param $1 v128) (result v128)
(f64x2.pmin
(local.get $0)
(local.get $1)
)
)
- (func $160 (param $0 v128) (param $1 v128) (result v128)
+ (func $161 (param $0 v128) (param $1 v128) (result v128)
(f64x2.pmax
(local.get $0)
(local.get $1)
)
)
- (func $161 (param $0 v128) (result v128)
+ (func $162 (param $0 v128) (result v128)
(f64x2.abs
(local.get $0)
)
)
- (func $162 (param $0 v128) (result v128)
+ (func $163 (param $0 v128) (result v128)
(f64x2.neg
(local.get $0)
)
)
- (func $163 (param $0 v128) (result v128)
+ (func $164 (param $0 v128) (result v128)
(f64x2.sqrt
(local.get $0)
)
)
- (func $164 (param $0 v128) (param $1 v128) (param $2 v128) (result v128)
+ (func $165 (param $0 v128) (param $1 v128) (param $2 v128) (result v128)
(f64x2.qfma
(local.get $0)
(local.get $1)
(local.get $2)
)
)
- (func $165 (param $0 v128) (param $1 v128) (param $2 v128) (result v128)
+ (func $166 (param $0 v128) (param $1 v128) (param $2 v128) (result v128)
(f64x2.qfms
(local.get $0)
(local.get $1)
(local.get $2)
)
)
- (func $166 (param $0 v128) (result v128)
+ (func $167 (param $0 v128) (result v128)
(i32x4.trunc_sat_f32x4_s
(local.get $0)
)
)
- (func $167 (param $0 v128) (result v128)
+ (func $168 (param $0 v128) (result v128)
(i32x4.trunc_sat_f32x4_u
(local.get $0)
)
)
- (func $168 (param $0 v128) (result v128)
+ (func $169 (param $0 v128) (result v128)
(i64x2.trunc_sat_f64x2_s
(local.get $0)
)
)
- (func $169 (param $0 v128) (result v128)
+ (func $170 (param $0 v128) (result v128)
(i64x2.trunc_sat_f64x2_u
(local.get $0)
)
)
- (func $170 (param $0 v128) (result v128)
+ (func $171 (param $0 v128) (result v128)
(f32x4.convert_i32x4_s
(local.get $0)
)
)
- (func $171 (param $0 v128) (result v128)
+ (func $172 (param $0 v128) (result v128)
(f32x4.convert_i32x4_u
(local.get $0)
)
)
- (func $172 (param $0 v128) (result v128)
+ (func $173 (param $0 v128) (result v128)
(f64x2.convert_i64x2_s
(local.get $0)
)
)
- (func $173 (param $0 v128) (result v128)
+ (func $174 (param $0 v128) (result v128)
(f64x2.convert_i64x2_u
(local.get $0)
)
)
- (func $174 (param $0 i32) (result v128)
+ (func $175 (param $0 i32) (result v128)
(v8x16.load_splat
(local.get $0)
)
)
- (func $175 (param $0 i32) (result v128)
+ (func $176 (param $0 i32) (result v128)
(v16x8.load_splat
(local.get $0)
)
)
- (func $176 (param $0 i32) (result v128)
+ (func $177 (param $0 i32) (result v128)
(v32x4.load_splat
(local.get $0)
)
)
- (func $177 (param $0 i32) (result v128)
+ (func $178 (param $0 i32) (result v128)
(v64x2.load_splat
(local.get $0)
)
)
- (func $178 (param $0 v128) (param $1 v128) (result v128)
+ (func $179 (param $0 v128) (param $1 v128) (result v128)
(i8x16.narrow_i16x8_s
(local.get $0)
(local.get $1)
)
)
- (func $179 (param $0 v128) (param $1 v128) (result v128)
+ (func $180 (param $0 v128) (param $1 v128) (result v128)
(i8x16.narrow_i16x8_u
(local.get $0)
(local.get $1)
)
)
- (func $180 (param $0 v128) (param $1 v128) (result v128)
+ (func $181 (param $0 v128) (param $1 v128) (result v128)
(i16x8.narrow_i32x4_s
(local.get $0)
(local.get $1)
)
)
- (func $181 (param $0 v128) (param $1 v128) (result v128)
+ (func $182 (param $0 v128) (param $1 v128) (result v128)
(i16x8.narrow_i32x4_u
(local.get $0)
(local.get $1)
)
)
- (func $182 (param $0 v128) (result v128)
+ (func $183 (param $0 v128) (result v128)
(i16x8.widen_low_i8x16_s
(local.get $0)
)
)
- (func $183 (param $0 v128) (result v128)
+ (func $184 (param $0 v128) (result v128)
(i16x8.widen_high_i8x16_s
(local.get $0)
)
)
- (func $184 (param $0 v128) (result v128)
+ (func $185 (param $0 v128) (result v128)
(i16x8.widen_low_i8x16_u
(local.get $0)
)
)
- (func $185 (param $0 v128) (result v128)
+ (func $186 (param $0 v128) (result v128)
(i16x8.widen_high_i8x16_u
(local.get $0)
)
)
- (func $186 (param $0 v128) (result v128)
+ (func $187 (param $0 v128) (result v128)
(i32x4.widen_low_i16x8_s
(local.get $0)
)
)
- (func $187 (param $0 v128) (result v128)
+ (func $188 (param $0 v128) (result v128)
(i32x4.widen_high_i16x8_s
(local.get $0)
)
)
- (func $188 (param $0 v128) (result v128)
+ (func $189 (param $0 v128) (result v128)
(i32x4.widen_low_i16x8_u
(local.get $0)
)
)
- (func $189 (param $0 v128) (result v128)
+ (func $190 (param $0 v128) (result v128)
(i32x4.widen_high_i16x8_u
(local.get $0)
)
)
- (func $190 (param $0 i32) (result v128)
+ (func $191 (param $0 i32) (result v128)
(i16x8.load8x8_u
(local.get $0)
)
)
- (func $191 (param $0 i32) (result v128)
+ (func $192 (param $0 i32) (result v128)
(i16x8.load8x8_s
(local.get $0)
)
)
- (func $192 (param $0 i32) (result v128)
+ (func $193 (param $0 i32) (result v128)
(i32x4.load16x4_s
(local.get $0)
)
)
- (func $193 (param $0 i32) (result v128)
+ (func $194 (param $0 i32) (result v128)
(i32x4.load16x4_u
(local.get $0)
)
)
- (func $194 (param $0 i32) (result v128)
+ (func $195 (param $0 i32) (result v128)
(i64x2.load32x2_s
(local.get $0)
)
)
- (func $195 (param $0 i32) (result v128)
+ (func $196 (param $0 i32) (result v128)
(i64x2.load32x2_u
(local.get $0)
)
)
- (func $196 (param $0 v128) (param $1 v128) (result v128)
+ (func $197 (param $0 v128) (param $1 v128) (result v128)
(v8x16.swizzle
(local.get $0)
(local.get $1)
diff --git a/test/spec/simd.wast b/test/spec/simd.wast
index d6549f486..26da927a9 100644
--- a/test/spec/simd.wast
+++ b/test/spec/simd.wast
@@ -167,6 +167,7 @@
(func (export "i64x2.shr_u") (param $0 v128) (param $1 i32) (result v128) (i64x2.shr_u (local.get $0) (local.get $1)))
(func (export "i64x2.add") (param $0 v128) (param $1 v128) (result v128) (i64x2.add (local.get $0) (local.get $1)))
(func (export "i64x2.sub") (param $0 v128) (param $1 v128) (result v128) (i64x2.sub (local.get $0) (local.get $1)))
+ (func (export "i64x2.mul") (param $0 v128) (param $1 v128) (result v128) (i64x2.mul (local.get $0) (local.get $1)))
(func (export "f32x4.abs") (param $0 v128) (result v128) (f32x4.abs (local.get $0)))
(func (export "f32x4.neg") (param $0 v128) (result v128) (f32x4.neg (local.get $0)))
(func (export "f32x4.sqrt") (param $0 v128) (result v128) (f32x4.sqrt (local.get $0)))
@@ -783,6 +784,7 @@
(assert_return (invoke "i64x2.shr_u" (v128.const i64x2 1 0x8000000000000000) (i32.const 64)) (v128.const i64x2 1 0x8000000000000000))
(assert_return (invoke "i64x2.add" (v128.const i64x2 0x8000000000000001 42) (v128.const i64x2 0x8000000000000001 0)) (v128.const i64x2 2 42))
(assert_return (invoke "i64x2.sub" (v128.const i64x2 2 42) (v128.const i64x2 0x8000000000000001 0)) (v128.const i64x2 0x8000000000000001 42))
+(assert_return (invoke "i64x2.mul" (v128.const i64x2 2 42) (v128.const i64x2 0x8000000000000001 0)) (v128.const i64x2 2 0))
;; f32x4 arithmetic
(assert_return (invoke "f32x4.abs" (v128.const f32x4 -0 nan -infinity 5)) (v128.const f32x4 0 nan infinity 5))