diff options
-rwxr-xr-x | scripts/gen-s-parser.py | 1 | ||||
-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 | ||||
-rw-r--r-- | test/binaryen.js/kitchen-sink.js | 1 | ||||
-rw-r--r-- | test/binaryen.js/kitchen-sink.js.txt | 12 | ||||
-rw-r--r-- | test/example/c-api-kitchen-sink.c | 1 | ||||
-rw-r--r-- | test/example/c-api-kitchen-sink.txt | 6 | ||||
-rw-r--r-- | test/simd.wast | 6 | ||||
-rw-r--r-- | test/simd.wast.from-wast | 6 | ||||
-rw-r--r-- | test/simd.wast.fromBinary | 6 | ||||
-rw-r--r-- | test/simd.wast.fromBinary.noDebugInfo | 118 | ||||
-rw-r--r-- | test/spec/simd.wast | 2 |
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)) |