diff options
-rwxr-xr-x | scripts/gen-s-parser.py | 13 | ||||
-rw-r--r-- | src/binaryen-c.h | 4 | ||||
-rw-r--r-- | src/gen-s-parser.inc | 125 | ||||
-rw-r--r-- | src/ir/cost.h | 39 | ||||
-rw-r--r-- | src/literal.h | 13 | ||||
-rw-r--r-- | src/passes/Print.cpp | 41 | ||||
-rw-r--r-- | src/tools/fuzzing.h | 3 | ||||
-rw-r--r-- | src/wasm-binary.h | 14 | ||||
-rw-r--r-- | src/wasm-interpreter.h | 26 | ||||
-rw-r--r-- | src/wasm.h | 13 | ||||
-rw-r--r-- | src/wasm/literal.cpp | 40 | ||||
-rw-r--r-- | src/wasm/wasm-binary.cpp | 52 | ||||
-rw-r--r-- | src/wasm/wasm-stack.cpp | 52 | ||||
-rw-r--r-- | src/wasm/wasm-validator.cpp | 13 | ||||
-rw-r--r-- | test/simd.wast | 78 | ||||
-rw-r--r-- | test/simd.wast.from-wast | 78 | ||||
-rw-r--r-- | test/simd.wast.fromBinary | 78 | ||||
-rw-r--r-- | test/simd.wast.fromBinary.noDebugInfo | 262 | ||||
-rw-r--r-- | test/spec/simd.wast | 2 |
19 files changed, 840 insertions, 106 deletions
diff --git a/scripts/gen-s-parser.py b/scripts/gen-s-parser.py index 358f3f0b1..281eea185 100755 --- a/scripts/gen-s-parser.py +++ b/scripts/gen-s-parser.py @@ -399,6 +399,11 @@ instructions = [ ("i16x8.max_s", "makeBinary(s, BinaryOp::MaxSVecI16x8)"), ("i16x8.max_u", "makeBinary(s, BinaryOp::MaxUVecI16x8)"), ("i16x8.avgr_u", "makeBinary(s, BinaryOp::AvgrUVecI16x8)"), + ("i16x8.q15mulr_sat_s", "makeBinary(s, BinaryOp::Q15MulrSatSVecI16x8)"), + ("i16x8.extmul_low_i8x16_s", "makeBinary(s, BinaryOp::ExtMulLowSVecI16x8)"), + ("i16x8.extmul_high_i8x16_s", "makeBinary(s, BinaryOp::ExtMulHighSVecI16x8)"), + ("i16x8.extmul_low_i8x16_u", "makeBinary(s, BinaryOp::ExtMulLowUVecI16x8)"), + ("i16x8.extmul_high_i8x16_u", "makeBinary(s, BinaryOp::ExtMulHighUVecI16x8)"), ("i32x4.abs", "makeUnary(s, UnaryOp::AbsVecI32x4)"), ("i32x4.neg", "makeUnary(s, UnaryOp::NegVecI32x4)"), ("i32x4.any_true", "makeUnary(s, UnaryOp::AnyTrueVecI32x4)"), @@ -415,6 +420,10 @@ instructions = [ ("i32x4.max_s", "makeBinary(s, BinaryOp::MaxSVecI32x4)"), ("i32x4.max_u", "makeBinary(s, BinaryOp::MaxUVecI32x4)"), ("i32x4.dot_i16x8_s", "makeBinary(s, BinaryOp::DotSVecI16x8ToVecI32x4)"), + ("i32x4.extmul_low_i16x8_s", "makeBinary(s, BinaryOp::ExtMulLowSVecI32x4)"), + ("i32x4.extmul_high_i16x8_s", "makeBinary(s, BinaryOp::ExtMulHighSVecI32x4)"), + ("i32x4.extmul_low_i16x8_u", "makeBinary(s, BinaryOp::ExtMulLowUVecI32x4)"), + ("i32x4.extmul_high_i16x8_u", "makeBinary(s, BinaryOp::ExtMulHighUVecI32x4)"), ("i64x2.neg", "makeUnary(s, UnaryOp::NegVecI64x2)"), ("i64x2.any_true", "makeUnary(s, UnaryOp::AnyTrueVecI64x2)"), ("i64x2.all_true", "makeUnary(s, UnaryOp::AllTrueVecI64x2)"), @@ -424,6 +433,10 @@ instructions = [ ("i64x2.add", "makeBinary(s, BinaryOp::AddVecI64x2)"), ("i64x2.sub", "makeBinary(s, BinaryOp::SubVecI64x2)"), ("i64x2.mul", "makeBinary(s, BinaryOp::MulVecI64x2)"), + ("i64x2.extmul_low_i32x4_s", "makeBinary(s, BinaryOp::ExtMulLowSVecI64x2)"), + ("i64x2.extmul_high_i32x4_s", "makeBinary(s, BinaryOp::ExtMulHighSVecI64x2)"), + ("i64x2.extmul_low_i32x4_u", "makeBinary(s, BinaryOp::ExtMulLowUVecI64x2)"), + ("i64x2.extmul_high_i32x4_u", "makeBinary(s, BinaryOp::ExtMulHighUVecI64x2)"), ("f32x4.abs", "makeUnary(s, UnaryOp::AbsVecF32x4)"), ("f32x4.neg", "makeUnary(s, UnaryOp::NegVecF32x4)"), ("f32x4.sqrt", "makeUnary(s, UnaryOp::SqrtVecF32x4)"), diff --git a/src/binaryen-c.h b/src/binaryen-c.h index 83477e8d1..c84361d0e 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -485,7 +485,7 @@ BINARYEN_API BinaryenOp BinaryenOrVec128(void); BINARYEN_API BinaryenOp BinaryenXorVec128(void); BINARYEN_API BinaryenOp BinaryenAndNotVec128(void); BINARYEN_API BinaryenOp BinaryenBitselectVec128(void); -// TODO: Add i8x16.popcnt to C and JS APIs once merged to proposal +// TODO: Add i8x16.popcnt to C and JS APIs once merged to the proposal BINARYEN_API BinaryenOp BinaryenAbsVecI8x16(void); BINARYEN_API BinaryenOp BinaryenNegVecI8x16(void); BINARYEN_API BinaryenOp BinaryenAnyTrueVecI8x16(void); @@ -526,6 +526,8 @@ BINARYEN_API BinaryenOp BinaryenMinUVecI16x8(void); BINARYEN_API BinaryenOp BinaryenMaxSVecI16x8(void); BINARYEN_API BinaryenOp BinaryenMaxUVecI16x8(void); BINARYEN_API BinaryenOp BinaryenAvgrUVecI16x8(void); +// TODO: Add i16x8.q15mulr_sat_s to C and JS APIs once merged to the proposal +// TODO: Add extending multiplications to APIs once they are merged as well BINARYEN_API BinaryenOp BinaryenAbsVecI32x4(void); BINARYEN_API BinaryenOp BinaryenNegVecI32x4(void); BINARYEN_API BinaryenOp BinaryenAnyTrueVecI32x4(void); diff --git a/src/gen-s-parser.inc b/src/gen-s-parser.inc index 47ea6c969..87a19fb82 100644 --- a/src/gen-s-parser.inc +++ b/src/gen-s-parser.inc @@ -799,13 +799,45 @@ switch (op[0]) { if (strcmp(op, "i16x8.eq") == 0) { return makeBinary(s, BinaryOp::EqVecI16x8); } goto parse_error; case 'x': { - switch (op[19]) { - case 's': - if (strcmp(op, "i16x8.extract_lane_s") == 0) { return makeSIMDExtract(s, SIMDExtractOp::ExtractLaneSVecI16x8, 8); } - goto parse_error; - case 'u': - if (strcmp(op, "i16x8.extract_lane_u") == 0) { return makeSIMDExtract(s, SIMDExtractOp::ExtractLaneUVecI16x8, 8); } - goto parse_error; + switch (op[9]) { + case 'm': { + switch (op[13]) { + case 'h': { + switch (op[24]) { + case 's': + if (strcmp(op, "i16x8.extmul_high_i8x16_s") == 0) { return makeBinary(s, BinaryOp::ExtMulHighSVecI16x8); } + goto parse_error; + case 'u': + if (strcmp(op, "i16x8.extmul_high_i8x16_u") == 0) { return makeBinary(s, BinaryOp::ExtMulHighUVecI16x8); } + goto parse_error; + default: goto parse_error; + } + } + case 'l': { + switch (op[23]) { + case 's': + if (strcmp(op, "i16x8.extmul_low_i8x16_s") == 0) { return makeBinary(s, BinaryOp::ExtMulLowSVecI16x8); } + goto parse_error; + case 'u': + if (strcmp(op, "i16x8.extmul_low_i8x16_u") == 0) { return makeBinary(s, BinaryOp::ExtMulLowUVecI16x8); } + goto parse_error; + default: goto parse_error; + } + } + default: goto parse_error; + } + } + case 'r': { + switch (op[19]) { + case 's': + if (strcmp(op, "i16x8.extract_lane_s") == 0) { return makeSIMDExtract(s, SIMDExtractOp::ExtractLaneSVecI16x8, 8); } + goto parse_error; + case 'u': + if (strcmp(op, "i16x8.extract_lane_u") == 0) { return makeSIMDExtract(s, SIMDExtractOp::ExtractLaneUVecI16x8, 8); } + goto parse_error; + default: goto parse_error; + } + } default: goto parse_error; } } @@ -934,6 +966,9 @@ switch (op[0]) { default: goto parse_error; } } + case 'q': + if (strcmp(op, "i16x8.q15mulr_sat_s") == 0) { return makeBinary(s, BinaryOp::Q15MulrSatSVecI16x8); } + goto parse_error; case 'r': if (strcmp(op, "i16x8.replace_lane") == 0) { return makeSIMDReplace(s, SIMDReplaceOp::ReplaceLaneVecI16x8, 8); } goto parse_error; @@ -1520,9 +1555,41 @@ switch (op[0]) { case 'q': if (strcmp(op, "i32x4.eq") == 0) { return makeBinary(s, BinaryOp::EqVecI32x4); } goto parse_error; - case 'x': - if (strcmp(op, "i32x4.extract_lane") == 0) { return makeSIMDExtract(s, SIMDExtractOp::ExtractLaneVecI32x4, 4); } - goto parse_error; + case 'x': { + switch (op[9]) { + case 'm': { + switch (op[13]) { + case 'h': { + switch (op[24]) { + case 's': + if (strcmp(op, "i32x4.extmul_high_i16x8_s") == 0) { return makeBinary(s, BinaryOp::ExtMulHighSVecI32x4); } + goto parse_error; + case 'u': + if (strcmp(op, "i32x4.extmul_high_i16x8_u") == 0) { return makeBinary(s, BinaryOp::ExtMulHighUVecI32x4); } + goto parse_error; + default: goto parse_error; + } + } + case 'l': { + switch (op[23]) { + case 's': + if (strcmp(op, "i32x4.extmul_low_i16x8_s") == 0) { return makeBinary(s, BinaryOp::ExtMulLowSVecI32x4); } + goto parse_error; + case 'u': + if (strcmp(op, "i32x4.extmul_low_i16x8_u") == 0) { return makeBinary(s, BinaryOp::ExtMulLowUVecI32x4); } + goto parse_error; + default: goto parse_error; + } + } + default: goto parse_error; + } + } + case 'r': + if (strcmp(op, "i32x4.extract_lane") == 0) { return makeSIMDExtract(s, SIMDExtractOp::ExtractLaneVecI32x4, 4); } + goto parse_error; + default: goto parse_error; + } + } default: goto parse_error; } } @@ -2251,9 +2318,41 @@ switch (op[0]) { default: goto parse_error; } } - case 'e': - if (strcmp(op, "i64x2.extract_lane") == 0) { return makeSIMDExtract(s, SIMDExtractOp::ExtractLaneVecI64x2, 2); } - goto parse_error; + case 'e': { + switch (op[9]) { + case 'm': { + switch (op[13]) { + case 'h': { + switch (op[24]) { + case 's': + if (strcmp(op, "i64x2.extmul_high_i32x4_s") == 0) { return makeBinary(s, BinaryOp::ExtMulHighSVecI64x2); } + goto parse_error; + case 'u': + if (strcmp(op, "i64x2.extmul_high_i32x4_u") == 0) { return makeBinary(s, BinaryOp::ExtMulHighUVecI64x2); } + goto parse_error; + default: goto parse_error; + } + } + case 'l': { + switch (op[23]) { + case 's': + if (strcmp(op, "i64x2.extmul_low_i32x4_s") == 0) { return makeBinary(s, BinaryOp::ExtMulLowSVecI64x2); } + goto parse_error; + case 'u': + if (strcmp(op, "i64x2.extmul_low_i32x4_u") == 0) { return makeBinary(s, BinaryOp::ExtMulLowUVecI64x2); } + goto parse_error; + default: goto parse_error; + } + } + default: goto parse_error; + } + } + case 'r': + if (strcmp(op, "i64x2.extract_lane") == 0) { return makeSIMDExtract(s, SIMDExtractOp::ExtractLaneVecI64x2, 2); } + goto parse_error; + default: goto parse_error; + } + } case 'l': { switch (op[15]) { case 's': diff --git a/src/ir/cost.h b/src/ir/cost.h index 1095ff76e..96ef02286 100644 --- a/src/ir/cost.h +++ b/src/ir/cost.h @@ -648,6 +648,21 @@ struct CostAnalyzer : public Visitor<CostAnalyzer, Index> { case AvgrUVecI16x8: ret = 1; break; + case Q15MulrSatSVecI16x8: + ret = 1; + break; + case ExtMulLowSVecI16x8: + ret = 1; + break; + case ExtMulHighSVecI16x8: + ret = 1; + break; + case ExtMulLowUVecI16x8: + ret = 1; + break; + case ExtMulHighUVecI16x8: + ret = 1; + break; case AddVecI32x4: ret = 1; break; @@ -672,6 +687,18 @@ struct CostAnalyzer : public Visitor<CostAnalyzer, Index> { case DotSVecI16x8ToVecI32x4: ret = 1; break; + case ExtMulLowSVecI32x4: + ret = 1; + break; + case ExtMulHighSVecI32x4: + ret = 1; + break; + case ExtMulLowUVecI32x4: + ret = 1; + break; + case ExtMulHighUVecI32x4: + ret = 1; + break; case AddVecI64x2: ret = 1; break; @@ -681,6 +708,18 @@ struct CostAnalyzer : public Visitor<CostAnalyzer, Index> { case MulVecI64x2: ret = 1; break; + case ExtMulLowSVecI64x2: + ret = 1; + break; + case ExtMulHighSVecI64x2: + ret = 1; + break; + case ExtMulLowUVecI64x2: + ret = 1; + break; + case ExtMulHighUVecI64x2: + ret = 1; + break; case AddVecF32x4: ret = 1; break; diff --git a/src/literal.h b/src/literal.h index 8ead70fc7..d94d1a6d0 100644 --- a/src/literal.h +++ b/src/literal.h @@ -509,6 +509,11 @@ public: Literal maxSI16x8(const Literal& other) const; Literal maxUI16x8(const Literal& other) const; Literal avgrUI16x8(const Literal& other) const; + Literal q15MulrSatSI16x8(const Literal& other) const; + Literal extMulLowSI16x8(const Literal& other) const; + Literal extMulHighSI16x8(const Literal& other) const; + Literal extMulLowUI16x8(const Literal& other) const; + Literal extMulHighUI16x8(const Literal& other) const; Literal absI32x4() const; Literal negI32x4() const; Literal anyTrueI32x4() const; @@ -525,6 +530,10 @@ public: Literal maxSI32x4(const Literal& other) const; Literal maxUI32x4(const Literal& other) const; Literal dotSI16x8toI32x4(const Literal& other) const; + Literal extMulLowSI32x4(const Literal& other) const; + Literal extMulHighSI32x4(const Literal& other) const; + Literal extMulLowUI32x4(const Literal& other) const; + Literal extMulHighUI32x4(const Literal& other) const; Literal negI64x2() const; Literal anyTrueI64x2() const; Literal allTrueI64x2() const; @@ -534,6 +543,10 @@ public: Literal addI64x2(const Literal& other) const; Literal subI64x2(const Literal& other) const; Literal mulI64x2(const Literal& other) const; + Literal extMulLowSI64x2(const Literal& other) const; + Literal extMulHighSI64x2(const Literal& other) const; + Literal extMulLowUI64x2(const Literal& other) const; + Literal extMulHighUI64x2(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 c093158f3..e653e85bd 100644 --- a/src/passes/Print.cpp +++ b/src/passes/Print.cpp @@ -1357,6 +1357,22 @@ struct PrintExpressionContents case AvgrUVecI16x8: o << "i16x8.avgr_u"; break; + case Q15MulrSatSVecI16x8: + o << "i16x8.q15mulr_sat_s"; + break; + case ExtMulLowSVecI16x8: + o << "i16x8.extmul_low_i8x16_s"; + break; + case ExtMulHighSVecI16x8: + o << "i16x8.extmul_high_i8x16_s"; + break; + case ExtMulLowUVecI16x8: + o << "i16x8.extmul_low_i8x16_u"; + break; + case ExtMulHighUVecI16x8: + o << "i16x8.extmul_high_i8x16_u"; + break; + case AddVecI32x4: o << "i32x4.add"; break; @@ -1381,6 +1397,19 @@ struct PrintExpressionContents case DotSVecI16x8ToVecI32x4: o << "i32x4.dot_i16x8_s"; break; + case ExtMulLowSVecI32x4: + o << "i32x4.extmul_low_i16x8_s"; + break; + case ExtMulHighSVecI32x4: + o << "i32x4.extmul_high_i16x8_s"; + break; + case ExtMulLowUVecI32x4: + o << "i32x4.extmul_low_i16x8_u"; + break; + case ExtMulHighUVecI32x4: + o << "i32x4.extmul_high_i16x8_u"; + break; + case AddVecI64x2: o << "i64x2.add"; break; @@ -1390,6 +1419,18 @@ struct PrintExpressionContents case MulVecI64x2: o << "i64x2.mul"; break; + case ExtMulLowSVecI64x2: + o << "i64x2.extmul_low_i32x4_s"; + break; + case ExtMulHighSVecI64x2: + o << "i64x2.extmul_high_i32x4_s"; + break; + case ExtMulLowUVecI64x2: + o << "i64x2.extmul_low_i32x4_u"; + break; + case ExtMulHighUVecI64x2: + o << "i64x2.extmul_high_i32x4_u"; + break; case AddVecF32x4: o << "f32x4.add"; diff --git a/src/tools/fuzzing.h b/src/tools/fuzzing.h index f4c29be55..9b3649d79 100644 --- a/src/tools/fuzzing.h +++ b/src/tools/fuzzing.h @@ -2448,6 +2448,9 @@ private: MinUVecI8x16, MaxSVecI8x16, MaxUVecI8x16, + // TODO: avgr_u + // TODO: q15mulr_sat_s + // TODO: extmul AddVecI16x8, AddSatSVecI16x8, AddSatUVecI16x8, diff --git a/src/wasm-binary.h b/src/wasm-binary.h index e1247a2d4..8d7abfd70 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -851,6 +851,7 @@ enum ASTNodes { I16x8MaxS = 0x98, I16x8MaxU = 0x99, I16x8AvgrU = 0x9b, + I16x8Q15MulrSatS = 0x9c, I32x4Abs = 0xa0, I32x4Neg = 0xa1, @@ -934,6 +935,19 @@ enum ASTNodes { F64x2ConvertSI64x2 = 0x0102, F64x2ConvertUI64x2 = 0x0103, + I16x8ExtMulLowSI8x16 = 0x9a, + I16x8ExtMulHighSI8x16 = 0x9d, + I16x8ExtMulLowUI8x16 = 0x9e, + I16x8ExtMulHighUI8x16 = 0x9f, + I32x4ExtMulLowSI16x8 = 0xbb, + I32x4ExtMulHighSI16x8 = 0xbd, + I32x4ExtMulLowUI16x8 = 0xbe, + I32x4ExtMulHighUI16x8 = 0xbf, + I64x2ExtMulLowSI32x4 = 0xd2, + I64x2ExtMulHighSI32x4 = 0xd3, + I64x2ExtMulLowUI32x4 = 0xd6, + I64x2ExtMulHighUI32x4 = 0xd7, + // bulk memory opcodes MemoryInit = 0x08, diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 932f97dd3..6f0d10565 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -878,6 +878,16 @@ public: return left.maxUI16x8(right); case AvgrUVecI16x8: return left.avgrUI16x8(right); + case Q15MulrSatSVecI16x8: + return left.q15MulrSatSI16x8(right); + case ExtMulLowSVecI16x8: + return left.extMulLowSI16x8(right); + case ExtMulHighSVecI16x8: + return left.extMulHighSI16x8(right); + case ExtMulLowUVecI16x8: + return left.extMulLowUI16x8(right); + case ExtMulHighUVecI16x8: + return left.extMulHighUI16x8(right); case AddVecI32x4: return left.addI32x4(right); case SubVecI32x4: @@ -894,12 +904,28 @@ public: return left.maxUI32x4(right); case DotSVecI16x8ToVecI32x4: return left.dotSI16x8toI32x4(right); + case ExtMulLowSVecI32x4: + return left.extMulLowSI32x4(right); + case ExtMulHighSVecI32x4: + return left.extMulHighSI32x4(right); + case ExtMulLowUVecI32x4: + return left.extMulLowUI32x4(right); + case ExtMulHighUVecI32x4: + return left.extMulHighUI32x4(right); case AddVecI64x2: return left.addI64x2(right); case SubVecI64x2: return left.subI64x2(right); case MulVecI64x2: return left.mulI64x2(right); + case ExtMulLowSVecI64x2: + return left.extMulLowSI64x2(right); + case ExtMulHighSVecI64x2: + return left.extMulHighSI64x2(right); + case ExtMulLowUVecI64x2: + return left.extMulLowUI64x2(right); + case ExtMulHighUVecI64x2: + return left.extMulHighUI64x2(right); case AddVecF32x4: return left.addF32x4(right); diff --git a/src/wasm.h b/src/wasm.h index 295088780..feaa51e40 100644 --- a/src/wasm.h +++ b/src/wasm.h @@ -393,6 +393,11 @@ enum BinaryOp { MaxSVecI16x8, MaxUVecI16x8, AvgrUVecI16x8, + Q15MulrSatSVecI16x8, + ExtMulLowSVecI16x8, + ExtMulHighSVecI16x8, + ExtMulLowUVecI16x8, + ExtMulHighUVecI16x8, AddVecI32x4, SubVecI32x4, MulVecI32x4, @@ -401,9 +406,17 @@ enum BinaryOp { MaxSVecI32x4, MaxUVecI32x4, DotSVecI16x8ToVecI32x4, + ExtMulLowSVecI32x4, + ExtMulHighSVecI32x4, + ExtMulLowUVecI32x4, + ExtMulHighUVecI32x4, AddVecI64x2, SubVecI64x2, MulVecI64x2, + ExtMulLowSVecI64x2, + ExtMulHighSVecI64x2, + ExtMulLowUVecI64x2, + ExtMulHighUVecI64x2, AddVecF32x4, SubVecF32x4, MulVecF32x4, diff --git a/src/wasm/literal.cpp b/src/wasm/literal.cpp index f549a9ca6..6d0a0fee7 100644 --- a/src/wasm/literal.cpp +++ b/src/wasm/literal.cpp @@ -2100,6 +2100,9 @@ Literal Literal::maxUI16x8(const Literal& other) const { Literal Literal::avgrUI16x8(const Literal& other) const { return binary<8, &Literal::getLanesUI16x8, &Literal::avgrUInt>(*this, other); } +Literal Literal::q15MulrSatSI16x8(const Literal& other) const { + WASM_UNREACHABLE("TODO: implement Q15 rounding, saturating multiplication"); +} Literal Literal::addI32x4(const Literal& other) const { return binary<4, &Literal::getLanesI32x4, &Literal::add>(*this, other); } @@ -2277,6 +2280,43 @@ Literal Literal::widenHighUToVecI32x4() const { return widen<4, &Literal::getLanesUI16x8, LaneOrder::High>(*this); } +Literal Literal::extMulLowSI16x8(const Literal& other) const { + WASM_UNREACHABLE("TODO: implement SIMD extending multiplications"); +} +Literal Literal::extMulHighSI16x8(const Literal& other) const { + WASM_UNREACHABLE("TODO: implement SIMD extending multiplications"); +} +Literal Literal::extMulLowUI16x8(const Literal& other) const { + WASM_UNREACHABLE("TODO: implement SIMD extending multiplications"); +} +Literal Literal::extMulHighUI16x8(const Literal& other) const { + WASM_UNREACHABLE("TODO: implement SIMD extending multiplications"); +} +Literal Literal::extMulLowSI32x4(const Literal& other) const { + WASM_UNREACHABLE("TODO: implement SIMD extending multiplications"); +} +Literal Literal::extMulHighSI32x4(const Literal& other) const { + WASM_UNREACHABLE("TODO: implement SIMD extending multiplications"); +} +Literal Literal::extMulLowUI32x4(const Literal& other) const { + WASM_UNREACHABLE("TODO: implement SIMD extending multiplications"); +} +Literal Literal::extMulHighUI32x4(const Literal& other) const { + WASM_UNREACHABLE("TODO: implement SIMD extending multiplications"); +} +Literal Literal::extMulLowSI64x2(const Literal& other) const { + WASM_UNREACHABLE("TODO: implement SIMD extending multiplications"); +} +Literal Literal::extMulHighSI64x2(const Literal& other) const { + WASM_UNREACHABLE("TODO: implement SIMD extending multiplications"); +} +Literal Literal::extMulLowUI64x2(const Literal& other) const { + WASM_UNREACHABLE("TODO: implement SIMD extending multiplications"); +} +Literal Literal::extMulHighUI64x2(const Literal& other) const { + WASM_UNREACHABLE("TODO: implement SIMD extending multiplications"); +} + Literal Literal::swizzleVec8x16(const Literal& other) const { auto lanes = getLanesUI8x16(); auto indices = other.getLanesUI8x16(); diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 0c56af8e0..46ce205b7 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -4303,6 +4303,26 @@ bool WasmBinaryBuilder::maybeVisitSIMDBinary(Expression*& out, uint32_t code) { curr = allocator.alloc<Binary>(); curr->op = AvgrUVecI16x8; break; + case BinaryConsts::I16x8Q15MulrSatS: + curr = allocator.alloc<Binary>(); + curr->op = Q15MulrSatSVecI16x8; + break; + case BinaryConsts::I16x8ExtMulLowSI8x16: + curr = allocator.alloc<Binary>(); + curr->op = ExtMulLowSVecI16x8; + break; + case BinaryConsts::I16x8ExtMulHighSI8x16: + curr = allocator.alloc<Binary>(); + curr->op = ExtMulHighSVecI16x8; + break; + case BinaryConsts::I16x8ExtMulLowUI8x16: + curr = allocator.alloc<Binary>(); + curr->op = ExtMulLowUVecI16x8; + break; + case BinaryConsts::I16x8ExtMulHighUI8x16: + curr = allocator.alloc<Binary>(); + curr->op = ExtMulHighUVecI16x8; + break; case BinaryConsts::I32x4Add: curr = allocator.alloc<Binary>(); curr->op = AddVecI32x4; @@ -4335,6 +4355,22 @@ bool WasmBinaryBuilder::maybeVisitSIMDBinary(Expression*& out, uint32_t code) { curr = allocator.alloc<Binary>(); curr->op = DotSVecI16x8ToVecI32x4; break; + case BinaryConsts::I32x4ExtMulLowSI16x8: + curr = allocator.alloc<Binary>(); + curr->op = ExtMulLowSVecI32x4; + break; + case BinaryConsts::I32x4ExtMulHighSI16x8: + curr = allocator.alloc<Binary>(); + curr->op = ExtMulHighSVecI32x4; + break; + case BinaryConsts::I32x4ExtMulLowUI16x8: + curr = allocator.alloc<Binary>(); + curr->op = ExtMulLowUVecI32x4; + break; + case BinaryConsts::I32x4ExtMulHighUI16x8: + curr = allocator.alloc<Binary>(); + curr->op = ExtMulHighUVecI32x4; + break; case BinaryConsts::I64x2Add: curr = allocator.alloc<Binary>(); curr->op = AddVecI64x2; @@ -4347,6 +4383,22 @@ bool WasmBinaryBuilder::maybeVisitSIMDBinary(Expression*& out, uint32_t code) { curr = allocator.alloc<Binary>(); curr->op = MulVecI64x2; break; + case BinaryConsts::I64x2ExtMulLowSI32x4: + curr = allocator.alloc<Binary>(); + curr->op = ExtMulLowSVecI64x2; + break; + case BinaryConsts::I64x2ExtMulHighSI32x4: + curr = allocator.alloc<Binary>(); + curr->op = ExtMulHighSVecI64x2; + break; + case BinaryConsts::I64x2ExtMulLowUI32x4: + curr = allocator.alloc<Binary>(); + curr->op = ExtMulLowUVecI64x2; + break; + case BinaryConsts::I64x2ExtMulHighUI32x4: + curr = allocator.alloc<Binary>(); + curr->op = ExtMulHighUVecI64x2; + 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 1d290f53c..7139eb502 100644 --- a/src/wasm/wasm-stack.cpp +++ b/src/wasm/wasm-stack.cpp @@ -1587,6 +1587,26 @@ void BinaryInstWriter::visitBinary(Binary* curr) { case AvgrUVecI16x8: o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I16x8AvgrU); break; + case Q15MulrSatSVecI16x8: + o << int8_t(BinaryConsts::SIMDPrefix) + << U32LEB(BinaryConsts::I16x8Q15MulrSatS); + break; + case ExtMulLowSVecI16x8: + o << int8_t(BinaryConsts::SIMDPrefix) + << U32LEB(BinaryConsts::I16x8ExtMulLowSI8x16); + break; + case ExtMulHighSVecI16x8: + o << int8_t(BinaryConsts::SIMDPrefix) + << U32LEB(BinaryConsts::I16x8ExtMulHighSI8x16); + break; + case ExtMulLowUVecI16x8: + o << int8_t(BinaryConsts::SIMDPrefix) + << U32LEB(BinaryConsts::I16x8ExtMulLowUI8x16); + break; + case ExtMulHighUVecI16x8: + o << int8_t(BinaryConsts::SIMDPrefix) + << U32LEB(BinaryConsts::I16x8ExtMulHighUI8x16); + break; case AddVecI32x4: o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I32x4Add); break; @@ -1612,6 +1632,22 @@ void BinaryInstWriter::visitBinary(Binary* curr) { o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I32x4DotSVecI16x8); break; + case ExtMulLowSVecI32x4: + o << int8_t(BinaryConsts::SIMDPrefix) + << U32LEB(BinaryConsts::I32x4ExtMulLowSI16x8); + break; + case ExtMulHighSVecI32x4: + o << int8_t(BinaryConsts::SIMDPrefix) + << U32LEB(BinaryConsts::I32x4ExtMulHighSI16x8); + break; + case ExtMulLowUVecI32x4: + o << int8_t(BinaryConsts::SIMDPrefix) + << U32LEB(BinaryConsts::I32x4ExtMulLowUI16x8); + break; + case ExtMulHighUVecI32x4: + o << int8_t(BinaryConsts::SIMDPrefix) + << U32LEB(BinaryConsts::I32x4ExtMulHighUI16x8); + break; case AddVecI64x2: o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I64x2Add); break; @@ -1621,6 +1657,22 @@ void BinaryInstWriter::visitBinary(Binary* curr) { case MulVecI64x2: o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I64x2Mul); break; + case ExtMulLowSVecI64x2: + o << int8_t(BinaryConsts::SIMDPrefix) + << U32LEB(BinaryConsts::I64x2ExtMulLowSI32x4); + break; + case ExtMulHighSVecI64x2: + o << int8_t(BinaryConsts::SIMDPrefix) + << U32LEB(BinaryConsts::I64x2ExtMulHighSI32x4); + break; + case ExtMulLowUVecI64x2: + o << int8_t(BinaryConsts::SIMDPrefix) + << U32LEB(BinaryConsts::I64x2ExtMulLowUI32x4); + break; + case ExtMulHighUVecI64x2: + o << int8_t(BinaryConsts::SIMDPrefix) + << U32LEB(BinaryConsts::I64x2ExtMulHighUI32x4); + 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 e09a8fb36..38dfa8092 100644 --- a/src/wasm/wasm-validator.cpp +++ b/src/wasm/wasm-validator.cpp @@ -1608,6 +1608,11 @@ void FunctionValidator::visitBinary(Binary* curr) { case MaxSVecI8x16: case MaxUVecI8x16: case AvgrUVecI8x16: + case Q15MulrSatSVecI16x8: + case ExtMulLowSVecI16x8: + case ExtMulHighSVecI16x8: + case ExtMulLowUVecI16x8: + case ExtMulHighUVecI16x8: case AddVecI16x8: case AddSatSVecI16x8: case AddSatUVecI16x8: @@ -1628,9 +1633,17 @@ void FunctionValidator::visitBinary(Binary* curr) { case MaxSVecI32x4: case MaxUVecI32x4: case DotSVecI16x8ToVecI32x4: + case ExtMulLowSVecI32x4: + case ExtMulHighSVecI32x4: + case ExtMulLowUVecI32x4: + case ExtMulHighUVecI32x4: case AddVecI64x2: case SubVecI64x2: case MulVecI64x2: + case ExtMulLowSVecI64x2: + case ExtMulHighSVecI64x2: + case ExtMulLowUVecI64x2: + case ExtMulHighUVecI64x2: case AddVecF32x4: case SubVecF32x4: case MulVecF32x4: diff --git a/test/simd.wast b/test/simd.wast index fd430d4ed..8ff2298a8 100644 --- a/test/simd.wast +++ b/test/simd.wast @@ -743,6 +743,36 @@ (local.get $1) ) ) + (func $i16x8.q15mulr_sat_s (param $0 v128) (param $1 v128) (result v128) + (i16x8.q15mulr_sat_s + (local.get $0) + (local.get $1) + ) + ) + (func $i16x8.extmul_low_i8x16_s (param $0 v128) (param $1 v128) (result v128) + (i16x8.extmul_low_i8x16_s + (local.get $0) + (local.get $1) + ) + ) + (func $i16x8.extmul_high_i8x16_s (param $0 v128) (param $1 v128) (result v128) + (i16x8.extmul_high_i8x16_s + (local.get $0) + (local.get $1) + ) + ) + (func $i16x8.extmul_low_i8x16_u (param $0 v128) (param $1 v128) (result v128) + (i16x8.extmul_low_i8x16_u + (local.get $0) + (local.get $1) + ) + ) + (func $i16x8.extmul_high_i8x16_u (param $0 v128) (param $1 v128) (result v128) + (i16x8.extmul_high_i8x16_u + (local.get $0) + (local.get $1) + ) + ) (func $i32x4.abs (param $0 v128) (result v128) (i32x4.abs (local.get $0) @@ -834,6 +864,30 @@ (local.get $1) ) ) + (func $i32x4.extmul_low_i16x8_s (param $0 v128) (param $1 v128) (result v128) + (i32x4.extmul_low_i16x8_s + (local.get $0) + (local.get $1) + ) + ) + (func $i32x4.extmul_high_i16x8_s (param $0 v128) (param $1 v128) (result v128) + (i32x4.extmul_high_i16x8_s + (local.get $0) + (local.get $1) + ) + ) + (func $i32x4.extmul_low_i16x8_u (param $0 v128) (param $1 v128) (result v128) + (i32x4.extmul_low_i16x8_u + (local.get $0) + (local.get $1) + ) + ) + (func $i32x4.extmul_high_i16x8_u (param $0 v128) (param $1 v128) (result v128) + (i32x4.extmul_high_i16x8_u + (local.get $0) + (local.get $1) + ) + ) (func $i64x2.neg (param $0 v128) (result v128) (i64x2.neg (local.get $0) @@ -885,6 +939,30 @@ (local.get $1) ) ) + (func $i64x2.extmul_low_i32x4_s (param $0 v128) (param $1 v128) (result v128) + (i64x2.extmul_low_i32x4_s + (local.get $0) + (local.get $1) + ) + ) + (func $i64x2.extmul_high_i32x4_s (param $0 v128) (param $1 v128) (result v128) + (i64x2.extmul_high_i32x4_s + (local.get $0) + (local.get $1) + ) + ) + (func $i64x2.extmul_low_i32x4_u (param $0 v128) (param $1 v128) (result v128) + (i64x2.extmul_low_i32x4_u + (local.get $0) + (local.get $1) + ) + ) + (func $i64x2.extmul_high_i32x4_u (param $0 v128) (param $1 v128) (result v128) + (i64x2.extmul_high_i32x4_u + (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 66fb68baa..bf71a0ac3 100644 --- a/test/simd.wast.from-wast +++ b/test/simd.wast.from-wast @@ -760,6 +760,36 @@ (local.get $1) ) ) + (func $i16x8.q15mulr_sat_s (param $0 v128) (param $1 v128) (result v128) + (i16x8.q15mulr_sat_s + (local.get $0) + (local.get $1) + ) + ) + (func $i16x8.extmul_low_i8x16_s (param $0 v128) (param $1 v128) (result v128) + (i16x8.extmul_low_i8x16_s + (local.get $0) + (local.get $1) + ) + ) + (func $i16x8.extmul_high_i8x16_s (param $0 v128) (param $1 v128) (result v128) + (i16x8.extmul_high_i8x16_s + (local.get $0) + (local.get $1) + ) + ) + (func $i16x8.extmul_low_i8x16_u (param $0 v128) (param $1 v128) (result v128) + (i16x8.extmul_low_i8x16_u + (local.get $0) + (local.get $1) + ) + ) + (func $i16x8.extmul_high_i8x16_u (param $0 v128) (param $1 v128) (result v128) + (i16x8.extmul_high_i8x16_u + (local.get $0) + (local.get $1) + ) + ) (func $i32x4.abs (param $0 v128) (result v128) (i32x4.abs (local.get $0) @@ -851,6 +881,30 @@ (local.get $1) ) ) + (func $i32x4.extmul_low_i16x8_s (param $0 v128) (param $1 v128) (result v128) + (i32x4.extmul_low_i16x8_s + (local.get $0) + (local.get $1) + ) + ) + (func $i32x4.extmul_high_i16x8_s (param $0 v128) (param $1 v128) (result v128) + (i32x4.extmul_high_i16x8_s + (local.get $0) + (local.get $1) + ) + ) + (func $i32x4.extmul_low_i16x8_u (param $0 v128) (param $1 v128) (result v128) + (i32x4.extmul_low_i16x8_u + (local.get $0) + (local.get $1) + ) + ) + (func $i32x4.extmul_high_i16x8_u (param $0 v128) (param $1 v128) (result v128) + (i32x4.extmul_high_i16x8_u + (local.get $0) + (local.get $1) + ) + ) (func $i64x2.neg (param $0 v128) (result v128) (i64x2.neg (local.get $0) @@ -902,6 +956,30 @@ (local.get $1) ) ) + (func $i64x2.extmul_low_i32x4_s (param $0 v128) (param $1 v128) (result v128) + (i64x2.extmul_low_i32x4_s + (local.get $0) + (local.get $1) + ) + ) + (func $i64x2.extmul_high_i32x4_s (param $0 v128) (param $1 v128) (result v128) + (i64x2.extmul_high_i32x4_s + (local.get $0) + (local.get $1) + ) + ) + (func $i64x2.extmul_low_i32x4_u (param $0 v128) (param $1 v128) (result v128) + (i64x2.extmul_low_i32x4_u + (local.get $0) + (local.get $1) + ) + ) + (func $i64x2.extmul_high_i32x4_u (param $0 v128) (param $1 v128) (result v128) + (i64x2.extmul_high_i32x4_u + (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 1b5c59e35..94435e153 100644 --- a/test/simd.wast.fromBinary +++ b/test/simd.wast.fromBinary @@ -760,6 +760,36 @@ (local.get $1) ) ) + (func $i16x8.q15mulr_sat_s (param $0 v128) (param $1 v128) (result v128) + (i16x8.q15mulr_sat_s + (local.get $0) + (local.get $1) + ) + ) + (func $i16x8.extmul_low_i8x16_s (param $0 v128) (param $1 v128) (result v128) + (i16x8.extmul_low_i8x16_s + (local.get $0) + (local.get $1) + ) + ) + (func $i16x8.extmul_high_i8x16_s (param $0 v128) (param $1 v128) (result v128) + (i16x8.extmul_high_i8x16_s + (local.get $0) + (local.get $1) + ) + ) + (func $i16x8.extmul_low_i8x16_u (param $0 v128) (param $1 v128) (result v128) + (i16x8.extmul_low_i8x16_u + (local.get $0) + (local.get $1) + ) + ) + (func $i16x8.extmul_high_i8x16_u (param $0 v128) (param $1 v128) (result v128) + (i16x8.extmul_high_i8x16_u + (local.get $0) + (local.get $1) + ) + ) (func $i32x4.abs (param $0 v128) (result v128) (i32x4.abs (local.get $0) @@ -851,6 +881,30 @@ (local.get $1) ) ) + (func $i32x4.extmul_low_i16x8_s (param $0 v128) (param $1 v128) (result v128) + (i32x4.extmul_low_i16x8_s + (local.get $0) + (local.get $1) + ) + ) + (func $i32x4.extmul_high_i16x8_s (param $0 v128) (param $1 v128) (result v128) + (i32x4.extmul_high_i16x8_s + (local.get $0) + (local.get $1) + ) + ) + (func $i32x4.extmul_low_i16x8_u (param $0 v128) (param $1 v128) (result v128) + (i32x4.extmul_low_i16x8_u + (local.get $0) + (local.get $1) + ) + ) + (func $i32x4.extmul_high_i16x8_u (param $0 v128) (param $1 v128) (result v128) + (i32x4.extmul_high_i16x8_u + (local.get $0) + (local.get $1) + ) + ) (func $i64x2.neg (param $0 v128) (result v128) (i64x2.neg (local.get $0) @@ -902,6 +956,30 @@ (local.get $1) ) ) + (func $i64x2.extmul_low_i32x4_s (param $0 v128) (param $1 v128) (result v128) + (i64x2.extmul_low_i32x4_s + (local.get $0) + (local.get $1) + ) + ) + (func $i64x2.extmul_high_i32x4_s (param $0 v128) (param $1 v128) (result v128) + (i64x2.extmul_high_i32x4_s + (local.get $0) + (local.get $1) + ) + ) + (func $i64x2.extmul_low_i32x4_u (param $0 v128) (param $1 v128) (result v128) + (i64x2.extmul_low_i32x4_u + (local.get $0) + (local.get $1) + ) + ) + (func $i64x2.extmul_high_i32x4_u (param $0 v128) (param $1 v128) (result v128) + (i64x2.extmul_high_i32x4_u + (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 8bfe343c9..25d3ef4e2 100644 --- a/test/simd.wast.fromBinary.noDebugInfo +++ b/test/simd.wast.fromBinary.noDebugInfo @@ -760,507 +760,585 @@ (local.get $1) ) ) - (func $131 (param $0 v128) (result v128) + (func $131 (param $0 v128) (param $1 v128) (result v128) + (i16x8.q15mulr_sat_s + (local.get $0) + (local.get $1) + ) + ) + (func $132 (param $0 v128) (param $1 v128) (result v128) + (i16x8.extmul_low_i8x16_s + (local.get $0) + (local.get $1) + ) + ) + (func $133 (param $0 v128) (param $1 v128) (result v128) + (i16x8.extmul_high_i8x16_s + (local.get $0) + (local.get $1) + ) + ) + (func $134 (param $0 v128) (param $1 v128) (result v128) + (i16x8.extmul_low_i8x16_u + (local.get $0) + (local.get $1) + ) + ) + (func $135 (param $0 v128) (param $1 v128) (result v128) + (i16x8.extmul_high_i8x16_u + (local.get $0) + (local.get $1) + ) + ) + (func $136 (param $0 v128) (result v128) (i32x4.abs (local.get $0) ) ) - (func $132 (param $0 v128) (result v128) + (func $137 (param $0 v128) (result v128) (i32x4.neg (local.get $0) ) ) - (func $133 (param $0 v128) (result i32) + (func $138 (param $0 v128) (result i32) (i32x4.any_true (local.get $0) ) ) - (func $134 (param $0 v128) (result i32) + (func $139 (param $0 v128) (result i32) (i32x4.all_true (local.get $0) ) ) - (func $135 (param $0 v128) (result i32) + (func $140 (param $0 v128) (result i32) (i32x4.bitmask (local.get $0) ) ) - (func $136 (param $0 v128) (param $1 i32) (result v128) + (func $141 (param $0 v128) (param $1 i32) (result v128) (i32x4.shl (local.get $0) (local.get $1) ) ) - (func $137 (param $0 v128) (param $1 i32) (result v128) + (func $142 (param $0 v128) (param $1 i32) (result v128) (i32x4.shr_s (local.get $0) (local.get $1) ) ) - (func $138 (param $0 v128) (param $1 i32) (result v128) + (func $143 (param $0 v128) (param $1 i32) (result v128) (i32x4.shr_u (local.get $0) (local.get $1) ) ) - (func $139 (param $0 v128) (param $1 v128) (result v128) + (func $144 (param $0 v128) (param $1 v128) (result v128) (i32x4.add (local.get $0) (local.get $1) ) ) - (func $140 (param $0 v128) (param $1 v128) (result v128) + (func $145 (param $0 v128) (param $1 v128) (result v128) (i32x4.sub (local.get $0) (local.get $1) ) ) - (func $141 (param $0 v128) (param $1 v128) (result v128) + (func $146 (param $0 v128) (param $1 v128) (result v128) (i32x4.mul (local.get $0) (local.get $1) ) ) - (func $142 (param $0 v128) (param $1 v128) (result v128) + (func $147 (param $0 v128) (param $1 v128) (result v128) (i32x4.min_s (local.get $0) (local.get $1) ) ) - (func $143 (param $0 v128) (param $1 v128) (result v128) + (func $148 (param $0 v128) (param $1 v128) (result v128) (i32x4.min_u (local.get $0) (local.get $1) ) ) - (func $144 (param $0 v128) (param $1 v128) (result v128) + (func $149 (param $0 v128) (param $1 v128) (result v128) (i32x4.max_s (local.get $0) (local.get $1) ) ) - (func $145 (param $0 v128) (param $1 v128) (result v128) + (func $150 (param $0 v128) (param $1 v128) (result v128) (i32x4.max_u (local.get $0) (local.get $1) ) ) - (func $146 (param $0 v128) (param $1 v128) (result v128) + (func $151 (param $0 v128) (param $1 v128) (result v128) (i32x4.dot_i16x8_s (local.get $0) (local.get $1) ) ) - (func $147 (param $0 v128) (result v128) + (func $152 (param $0 v128) (param $1 v128) (result v128) + (i32x4.extmul_low_i16x8_s + (local.get $0) + (local.get $1) + ) + ) + (func $153 (param $0 v128) (param $1 v128) (result v128) + (i32x4.extmul_high_i16x8_s + (local.get $0) + (local.get $1) + ) + ) + (func $154 (param $0 v128) (param $1 v128) (result v128) + (i32x4.extmul_low_i16x8_u + (local.get $0) + (local.get $1) + ) + ) + (func $155 (param $0 v128) (param $1 v128) (result v128) + (i32x4.extmul_high_i16x8_u + (local.get $0) + (local.get $1) + ) + ) + (func $156 (param $0 v128) (result v128) (i64x2.neg (local.get $0) ) ) - (func $148 (param $0 v128) (result i32) + (func $157 (param $0 v128) (result i32) (i64x2.any_true (local.get $0) ) ) - (func $149 (param $0 v128) (result i32) + (func $158 (param $0 v128) (result i32) (i64x2.all_true (local.get $0) ) ) - (func $150 (param $0 v128) (param $1 i32) (result v128) + (func $159 (param $0 v128) (param $1 i32) (result v128) (i64x2.shl (local.get $0) (local.get $1) ) ) - (func $151 (param $0 v128) (param $1 i32) (result v128) + (func $160 (param $0 v128) (param $1 i32) (result v128) (i64x2.shr_s (local.get $0) (local.get $1) ) ) - (func $152 (param $0 v128) (param $1 i32) (result v128) + (func $161 (param $0 v128) (param $1 i32) (result v128) (i64x2.shr_u (local.get $0) (local.get $1) ) ) - (func $153 (param $0 v128) (param $1 v128) (result v128) + (func $162 (param $0 v128) (param $1 v128) (result v128) (i64x2.add (local.get $0) (local.get $1) ) ) - (func $154 (param $0 v128) (param $1 v128) (result v128) + (func $163 (param $0 v128) (param $1 v128) (result v128) (i64x2.sub (local.get $0) (local.get $1) ) ) - (func $155 (param $0 v128) (param $1 v128) (result v128) + (func $164 (param $0 v128) (param $1 v128) (result v128) (i64x2.mul (local.get $0) (local.get $1) ) ) - (func $156 (param $0 v128) (param $1 v128) (result v128) + (func $165 (param $0 v128) (param $1 v128) (result v128) + (i64x2.extmul_low_i32x4_s + (local.get $0) + (local.get $1) + ) + ) + (func $166 (param $0 v128) (param $1 v128) (result v128) + (i64x2.extmul_high_i32x4_s + (local.get $0) + (local.get $1) + ) + ) + (func $167 (param $0 v128) (param $1 v128) (result v128) + (i64x2.extmul_low_i32x4_u + (local.get $0) + (local.get $1) + ) + ) + (func $168 (param $0 v128) (param $1 v128) (result v128) + (i64x2.extmul_high_i32x4_u + (local.get $0) + (local.get $1) + ) + ) + (func $169 (param $0 v128) (param $1 v128) (result v128) (f32x4.add (local.get $0) (local.get $1) ) ) - (func $157 (param $0 v128) (param $1 v128) (result v128) + (func $170 (param $0 v128) (param $1 v128) (result v128) (f32x4.sub (local.get $0) (local.get $1) ) ) - (func $158 (param $0 v128) (param $1 v128) (result v128) + (func $171 (param $0 v128) (param $1 v128) (result v128) (f32x4.mul (local.get $0) (local.get $1) ) ) - (func $159 (param $0 v128) (param $1 v128) (result v128) + (func $172 (param $0 v128) (param $1 v128) (result v128) (f32x4.div (local.get $0) (local.get $1) ) ) - (func $160 (param $0 v128) (param $1 v128) (result v128) + (func $173 (param $0 v128) (param $1 v128) (result v128) (f32x4.min (local.get $0) (local.get $1) ) ) - (func $161 (param $0 v128) (param $1 v128) (result v128) + (func $174 (param $0 v128) (param $1 v128) (result v128) (f32x4.max (local.get $0) (local.get $1) ) ) - (func $162 (param $0 v128) (param $1 v128) (result v128) + (func $175 (param $0 v128) (param $1 v128) (result v128) (f32x4.pmin (local.get $0) (local.get $1) ) ) - (func $163 (param $0 v128) (param $1 v128) (result v128) + (func $176 (param $0 v128) (param $1 v128) (result v128) (f32x4.pmax (local.get $0) (local.get $1) ) ) - (func $164 (param $0 v128) (result v128) + (func $177 (param $0 v128) (result v128) (f32x4.ceil (local.get $0) ) ) - (func $165 (param $0 v128) (result v128) + (func $178 (param $0 v128) (result v128) (f32x4.floor (local.get $0) ) ) - (func $166 (param $0 v128) (result v128) + (func $179 (param $0 v128) (result v128) (f32x4.trunc (local.get $0) ) ) - (func $167 (param $0 v128) (result v128) + (func $180 (param $0 v128) (result v128) (f32x4.nearest (local.get $0) ) ) - (func $168 (param $0 v128) (result v128) + (func $181 (param $0 v128) (result v128) (f32x4.abs (local.get $0) ) ) - (func $169 (param $0 v128) (result v128) + (func $182 (param $0 v128) (result v128) (f32x4.neg (local.get $0) ) ) - (func $170 (param $0 v128) (result v128) + (func $183 (param $0 v128) (result v128) (f32x4.sqrt (local.get $0) ) ) - (func $171 (param $0 v128) (param $1 v128) (param $2 v128) (result v128) + (func $184 (param $0 v128) (param $1 v128) (param $2 v128) (result v128) (f32x4.qfma (local.get $0) (local.get $1) (local.get $2) ) ) - (func $172 (param $0 v128) (param $1 v128) (param $2 v128) (result v128) + (func $185 (param $0 v128) (param $1 v128) (param $2 v128) (result v128) (f32x4.qfms (local.get $0) (local.get $1) (local.get $2) ) ) - (func $173 (param $0 v128) (param $1 v128) (result v128) + (func $186 (param $0 v128) (param $1 v128) (result v128) (f64x2.add (local.get $0) (local.get $1) ) ) - (func $174 (param $0 v128) (param $1 v128) (result v128) + (func $187 (param $0 v128) (param $1 v128) (result v128) (f64x2.sub (local.get $0) (local.get $1) ) ) - (func $175 (param $0 v128) (param $1 v128) (result v128) + (func $188 (param $0 v128) (param $1 v128) (result v128) (f64x2.mul (local.get $0) (local.get $1) ) ) - (func $176 (param $0 v128) (param $1 v128) (result v128) + (func $189 (param $0 v128) (param $1 v128) (result v128) (f64x2.div (local.get $0) (local.get $1) ) ) - (func $177 (param $0 v128) (param $1 v128) (result v128) + (func $190 (param $0 v128) (param $1 v128) (result v128) (f64x2.min (local.get $0) (local.get $1) ) ) - (func $178 (param $0 v128) (param $1 v128) (result v128) + (func $191 (param $0 v128) (param $1 v128) (result v128) (f64x2.max (local.get $0) (local.get $1) ) ) - (func $179 (param $0 v128) (param $1 v128) (result v128) + (func $192 (param $0 v128) (param $1 v128) (result v128) (f64x2.pmin (local.get $0) (local.get $1) ) ) - (func $180 (param $0 v128) (param $1 v128) (result v128) + (func $193 (param $0 v128) (param $1 v128) (result v128) (f64x2.pmax (local.get $0) (local.get $1) ) ) - (func $181 (param $0 v128) (result v128) + (func $194 (param $0 v128) (result v128) (f64x2.ceil (local.get $0) ) ) - (func $182 (param $0 v128) (result v128) + (func $195 (param $0 v128) (result v128) (f64x2.floor (local.get $0) ) ) - (func $183 (param $0 v128) (result v128) + (func $196 (param $0 v128) (result v128) (f64x2.trunc (local.get $0) ) ) - (func $184 (param $0 v128) (result v128) + (func $197 (param $0 v128) (result v128) (f64x2.nearest (local.get $0) ) ) - (func $185 (param $0 v128) (result v128) + (func $198 (param $0 v128) (result v128) (f64x2.abs (local.get $0) ) ) - (func $186 (param $0 v128) (result v128) + (func $199 (param $0 v128) (result v128) (f64x2.neg (local.get $0) ) ) - (func $187 (param $0 v128) (result v128) + (func $200 (param $0 v128) (result v128) (f64x2.sqrt (local.get $0) ) ) - (func $188 (param $0 v128) (param $1 v128) (param $2 v128) (result v128) + (func $201 (param $0 v128) (param $1 v128) (param $2 v128) (result v128) (f64x2.qfma (local.get $0) (local.get $1) (local.get $2) ) ) - (func $189 (param $0 v128) (param $1 v128) (param $2 v128) (result v128) + (func $202 (param $0 v128) (param $1 v128) (param $2 v128) (result v128) (f64x2.qfms (local.get $0) (local.get $1) (local.get $2) ) ) - (func $190 (param $0 v128) (result v128) + (func $203 (param $0 v128) (result v128) (i32x4.trunc_sat_f32x4_s (local.get $0) ) ) - (func $191 (param $0 v128) (result v128) + (func $204 (param $0 v128) (result v128) (i32x4.trunc_sat_f32x4_u (local.get $0) ) ) - (func $192 (param $0 v128) (result v128) + (func $205 (param $0 v128) (result v128) (i64x2.trunc_sat_f64x2_s (local.get $0) ) ) - (func $193 (param $0 v128) (result v128) + (func $206 (param $0 v128) (result v128) (i64x2.trunc_sat_f64x2_u (local.get $0) ) ) - (func $194 (param $0 v128) (result v128) + (func $207 (param $0 v128) (result v128) (f32x4.convert_i32x4_s (local.get $0) ) ) - (func $195 (param $0 v128) (result v128) + (func $208 (param $0 v128) (result v128) (f32x4.convert_i32x4_u (local.get $0) ) ) - (func $196 (param $0 v128) (result v128) + (func $209 (param $0 v128) (result v128) (f64x2.convert_i64x2_s (local.get $0) ) ) - (func $197 (param $0 v128) (result v128) + (func $210 (param $0 v128) (result v128) (f64x2.convert_i64x2_u (local.get $0) ) ) - (func $198 (param $0 i32) (result v128) + (func $211 (param $0 i32) (result v128) (v8x16.load_splat (local.get $0) ) ) - (func $199 (param $0 i32) (result v128) + (func $212 (param $0 i32) (result v128) (v16x8.load_splat (local.get $0) ) ) - (func $200 (param $0 i32) (result v128) + (func $213 (param $0 i32) (result v128) (v32x4.load_splat (local.get $0) ) ) - (func $201 (param $0 i32) (result v128) + (func $214 (param $0 i32) (result v128) (v64x2.load_splat (local.get $0) ) ) - (func $202 (param $0 v128) (param $1 v128) (result v128) + (func $215 (param $0 v128) (param $1 v128) (result v128) (i8x16.narrow_i16x8_s (local.get $0) (local.get $1) ) ) - (func $203 (param $0 v128) (param $1 v128) (result v128) + (func $216 (param $0 v128) (param $1 v128) (result v128) (i8x16.narrow_i16x8_u (local.get $0) (local.get $1) ) ) - (func $204 (param $0 v128) (param $1 v128) (result v128) + (func $217 (param $0 v128) (param $1 v128) (result v128) (i16x8.narrow_i32x4_s (local.get $0) (local.get $1) ) ) - (func $205 (param $0 v128) (param $1 v128) (result v128) + (func $218 (param $0 v128) (param $1 v128) (result v128) (i16x8.narrow_i32x4_u (local.get $0) (local.get $1) ) ) - (func $206 (param $0 v128) (result v128) + (func $219 (param $0 v128) (result v128) (i16x8.widen_low_i8x16_s (local.get $0) ) ) - (func $207 (param $0 v128) (result v128) + (func $220 (param $0 v128) (result v128) (i16x8.widen_high_i8x16_s (local.get $0) ) ) - (func $208 (param $0 v128) (result v128) + (func $221 (param $0 v128) (result v128) (i16x8.widen_low_i8x16_u (local.get $0) ) ) - (func $209 (param $0 v128) (result v128) + (func $222 (param $0 v128) (result v128) (i16x8.widen_high_i8x16_u (local.get $0) ) ) - (func $210 (param $0 v128) (result v128) + (func $223 (param $0 v128) (result v128) (i32x4.widen_low_i16x8_s (local.get $0) ) ) - (func $211 (param $0 v128) (result v128) + (func $224 (param $0 v128) (result v128) (i32x4.widen_high_i16x8_s (local.get $0) ) ) - (func $212 (param $0 v128) (result v128) + (func $225 (param $0 v128) (result v128) (i32x4.widen_low_i16x8_u (local.get $0) ) ) - (func $213 (param $0 v128) (result v128) + (func $226 (param $0 v128) (result v128) (i32x4.widen_high_i16x8_u (local.get $0) ) ) - (func $214 (param $0 i32) (result v128) + (func $227 (param $0 i32) (result v128) (i16x8.load8x8_u (local.get $0) ) ) - (func $215 (param $0 i32) (result v128) + (func $228 (param $0 i32) (result v128) (i16x8.load8x8_s (local.get $0) ) ) - (func $216 (param $0 i32) (result v128) + (func $229 (param $0 i32) (result v128) (i32x4.load16x4_s (local.get $0) ) ) - (func $217 (param $0 i32) (result v128) + (func $230 (param $0 i32) (result v128) (i32x4.load16x4_u (local.get $0) ) ) - (func $218 (param $0 i32) (result v128) + (func $231 (param $0 i32) (result v128) (i64x2.load32x2_s (local.get $0) ) ) - (func $219 (param $0 i32) (result v128) + (func $232 (param $0 i32) (result v128) (i64x2.load32x2_u (local.get $0) ) ) - (func $220 (param $0 i32) (result v128) + (func $233 (param $0 i32) (result v128) (v128.load32_zero (local.get $0) ) ) - (func $221 (param $0 i32) (result v128) + (func $234 (param $0 i32) (result v128) (v128.load64_zero (local.get $0) ) ) - (func $222 (param $0 v128) (param $1 v128) (result v128) + (func $235 (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 b08a2db26..41b47170b 100644 --- a/test/spec/simd.wast +++ b/test/spec/simd.wast @@ -153,6 +153,8 @@ (func (export "i16x8.max_s") (param $0 v128) (param $1 v128) (result v128) (i16x8.max_s (local.get $0) (local.get $1))) (func (export "i16x8.max_u") (param $0 v128) (param $1 v128) (result v128) (i16x8.max_u (local.get $0) (local.get $1))) (func (export "i16x8.avgr_u") (param $0 v128) (param $1 v128) (result v128) (i16x8.avgr_u (local.get $0) (local.get $1))) + ;; TODO: Q15 rounding, saturating multiplication + ;; TODO: extending multiplications (func (export "i32x4.abs") (param $0 v128) (result v128) (i32x4.abs (local.get $0))) (func (export "i32x4.neg") (param $0 v128) (result v128) (i32x4.neg (local.get $0))) (func (export "i32x4.any_true") (param $0 v128) (result i32) (i32x4.any_true (local.get $0))) |