summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gen-s-parser.inc14
-rw-r--r--src/ir/cost.h1
-rw-r--r--src/passes/Print.cpp3
-rw-r--r--src/wasm-binary.h3
-rw-r--r--src/wasm-interpreter.h1
-rw-r--r--src/wasm.h1
-rw-r--r--src/wasm/wasm-binary.cpp6
-rw-r--r--src/wasm/wasm-stack.cpp6
-rw-r--r--src/wasm/wasm-validator.cpp3
9 files changed, 31 insertions, 7 deletions
diff --git a/src/gen-s-parser.inc b/src/gen-s-parser.inc
index d82914678..a9f8b5aab 100644
--- a/src/gen-s-parser.inc
+++ b/src/gen-s-parser.inc
@@ -1139,9 +1139,17 @@ switch (op[0]) {
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;
+ case 'r': {
+ switch (op[8]) {
+ case 'l':
+ if (strcmp(op, "i16x8.relaxed_q15mulr_s") == 0) { return makeBinary(s, BinaryOp::RelaxedQ15MulrSVecI16x8); }
+ goto parse_error;
+ case 'p':
+ if (strcmp(op, "i16x8.replace_lane") == 0) { return makeSIMDReplace(s, SIMDReplaceOp::ReplaceLaneVecI16x8, 8); }
+ goto parse_error;
+ default: goto parse_error;
+ }
+ }
case 's': {
switch (op[7]) {
case 'h': {
diff --git a/src/ir/cost.h b/src/ir/cost.h
index 93e243a80..fdd49047a 100644
--- a/src/ir/cost.h
+++ b/src/ir/cost.h
@@ -493,6 +493,7 @@ struct CostAnalyzer : public OverriddenVisitor<CostAnalyzer, CostType> {
case NarrowUVecI32x4ToVecI16x8:
case SwizzleVec8x16:
case RelaxedSwizzleVec8x16:
+ case RelaxedQ15MulrSVecI16x8:
ret = 1;
break;
case InvalidBinary:
diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp
index 5bdf84aba..edb95aba1 100644
--- a/src/passes/Print.cpp
+++ b/src/passes/Print.cpp
@@ -1851,6 +1851,9 @@ struct PrintExpressionContents
case RelaxedSwizzleVec8x16:
o << "i8x16.relaxed_swizzle";
break;
+ case RelaxedQ15MulrSVecI16x8:
+ o << "i16x8.relaxed_q15mulr_s";
+ break;
case InvalidBinary:
WASM_UNREACHABLE("unvalid binary operator");
diff --git a/src/wasm-binary.h b/src/wasm-binary.h
index 051f77f58..859efee54 100644
--- a/src/wasm-binary.h
+++ b/src/wasm-binary.h
@@ -887,7 +887,7 @@ enum ASTNodes {
I16x8Abs = 0x80,
I16x8Neg = 0x81,
- I16x8Q15mulrSatS = 0x82,
+ I16x8Q15MulrSatS = 0x82,
I16x8AllTrue = 0x83,
I16x8Bitmask = 0x84,
I16x8NarrowI32x4S = 0x85,
@@ -1037,6 +1037,7 @@ enum ASTNodes {
F32x4RelaxedMax = 0xe2,
F64x2RelaxedMin = 0xd4,
F64x2RelaxedMax = 0xee,
+ I16x8RelaxedQ15MulrS = 0x111,
// bulk memory opcodes
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h
index c1d2d8674..c695f26a2 100644
--- a/src/wasm-interpreter.h
+++ b/src/wasm-interpreter.h
@@ -917,6 +917,7 @@ public:
case AvgrUVecI16x8:
return left.avgrUI16x8(right);
case Q15MulrSatSVecI16x8:
+ case RelaxedQ15MulrSVecI16x8:
return left.q15MulrSatSI16x8(right);
case ExtMulLowSVecI16x8:
return left.extMulLowSI16x8(right);
diff --git a/src/wasm.h b/src/wasm.h
index 153cb4764..d361652b4 100644
--- a/src/wasm.h
+++ b/src/wasm.h
@@ -472,6 +472,7 @@ enum BinaryOp {
RelaxedMaxVecF32x4,
RelaxedMinVecF64x2,
RelaxedMaxVecF64x2,
+ RelaxedQ15MulrSVecI16x8,
InvalidBinary
};
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp
index b67fe013b..097ce2ae1 100644
--- a/src/wasm/wasm-binary.cpp
+++ b/src/wasm/wasm-binary.cpp
@@ -5397,7 +5397,7 @@ bool WasmBinaryBuilder::maybeVisitSIMDBinary(Expression*& out, uint32_t code) {
curr = allocator.alloc<Binary>();
curr->op = AvgrUVecI16x8;
break;
- case BinaryConsts::I16x8Q15mulrSatS:
+ case BinaryConsts::I16x8Q15MulrSatS:
curr = allocator.alloc<Binary>();
curr->op = Q15MulrSatSVecI16x8;
break;
@@ -5597,6 +5597,10 @@ bool WasmBinaryBuilder::maybeVisitSIMDBinary(Expression*& out, uint32_t code) {
curr = allocator.alloc<Binary>();
curr->op = RelaxedMaxVecF64x2;
break;
+ case BinaryConsts::I16x8RelaxedQ15MulrS:
+ curr = allocator.alloc<Binary>();
+ curr->op = RelaxedQ15MulrSVecI16x8;
+ break;
default:
return false;
}
diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp
index 616e0370b..98b681e1b 100644
--- a/src/wasm/wasm-stack.cpp
+++ b/src/wasm/wasm-stack.cpp
@@ -1666,7 +1666,7 @@ void BinaryInstWriter::visitBinary(Binary* curr) {
break;
case Q15MulrSatSVecI16x8:
o << int8_t(BinaryConsts::SIMDPrefix)
- << U32LEB(BinaryConsts::I16x8Q15mulrSatS);
+ << U32LEB(BinaryConsts::I16x8Q15MulrSatS);
break;
case ExtMulLowSVecI16x8:
o << int8_t(BinaryConsts::SIMDPrefix)
@@ -1842,6 +1842,10 @@ void BinaryInstWriter::visitBinary(Binary* curr) {
o << int8_t(BinaryConsts::SIMDPrefix)
<< U32LEB(BinaryConsts::F64x2RelaxedMax);
break;
+ case RelaxedQ15MulrSVecI16x8:
+ o << int8_t(BinaryConsts::SIMDPrefix)
+ << U32LEB(BinaryConsts::I16x8RelaxedQ15MulrS);
+ break;
case InvalidBinary:
WASM_UNREACHABLE("invalid binary op");
diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp
index 8d35543fc..1494fa400 100644
--- a/src/wasm/wasm-validator.cpp
+++ b/src/wasm/wasm-validator.cpp
@@ -1634,7 +1634,8 @@ void FunctionValidator::visitBinary(Binary* curr) {
case NarrowSVecI32x4ToVecI16x8:
case NarrowUVecI32x4ToVecI16x8:
case SwizzleVec8x16:
- case RelaxedSwizzleVec8x16: {
+ case RelaxedSwizzleVec8x16:
+ case RelaxedQ15MulrSVecI16x8: {
shouldBeEqualOrFirstIsUnreachable(
curr->left->type, Type(Type::v128), curr, "v128 op");
shouldBeEqualOrFirstIsUnreachable(