summaryrefslogtreecommitdiff
path: root/src/wasm
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm')
-rw-r--r--src/wasm/literal.cpp4
-rw-r--r--src/wasm/wasm-binary.cpp40
-rw-r--r--src/wasm/wasm-stack.cpp35
-rw-r--r--src/wasm/wasm-validator.cpp6
-rw-r--r--src/wasm/wasm.cpp5
5 files changed, 90 insertions, 0 deletions
diff --git a/src/wasm/literal.cpp b/src/wasm/literal.cpp
index c19efa225..9bdf886b3 100644
--- a/src/wasm/literal.cpp
+++ b/src/wasm/literal.cpp
@@ -1986,6 +1986,10 @@ Literal Literal::geSI32x4(const Literal& other) const {
Literal Literal::geUI32x4(const Literal& other) const {
return compare<4, &Literal::getLanesI32x4, &Literal::geU>(*this, other);
}
+Literal Literal::eqI64x2(const Literal& other) const {
+ return compare<2, &Literal::getLanesI64x2, &Literal::eq, int64_t>(*this,
+ other);
+}
Literal Literal::eqF32x4(const Literal& other) const {
return compare<4, &Literal::getLanesF32x4, &Literal::eq>(*this, other);
}
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp
index 1b3d50a41..796ba4b4e 100644
--- a/src/wasm/wasm-binary.cpp
+++ b/src/wasm/wasm-binary.cpp
@@ -4371,6 +4371,10 @@ bool WasmBinaryBuilder::maybeVisitSIMDBinary(Expression*& out, uint32_t code) {
curr = allocator.alloc<Binary>();
curr->op = GeUVecI32x4;
break;
+ case BinaryConsts::I64x2Eq:
+ curr = allocator.alloc<Binary>();
+ curr->op = EqVecI64x2;
+ break;
case BinaryConsts::F32x4Eq:
curr = allocator.alloc<Binary>();
curr->op = EqVecF32x4;
@@ -4828,6 +4832,10 @@ bool WasmBinaryBuilder::maybeVisitSIMDUnary(Expression*& out, uint32_t code) {
curr = allocator.alloc<Unary>();
curr->op = AllTrueVecI64x2;
break;
+ case BinaryConsts::I64x2Bitmask:
+ curr = allocator.alloc<Unary>();
+ curr->op = BitmaskVecI64x2;
+ break;
case BinaryConsts::F32x4Abs:
curr = allocator.alloc<Unary>();
curr->op = AbsVecF32x4;
@@ -4948,6 +4956,22 @@ bool WasmBinaryBuilder::maybeVisitSIMDUnary(Expression*& out, uint32_t code) {
curr = allocator.alloc<Unary>();
curr->op = WidenHighUVecI16x8ToVecI32x4;
break;
+ case BinaryConsts::I64x2WidenLowSI32x4:
+ curr = allocator.alloc<Unary>();
+ curr->op = WidenLowSVecI32x4ToVecI64x2;
+ break;
+ case BinaryConsts::I64x2WidenHighSI32x4:
+ curr = allocator.alloc<Unary>();
+ curr->op = WidenHighSVecI32x4ToVecI64x2;
+ break;
+ case BinaryConsts::I64x2WidenLowUI32x4:
+ curr = allocator.alloc<Unary>();
+ curr->op = WidenLowUVecI32x4ToVecI64x2;
+ break;
+ case BinaryConsts::I64x2WidenHighUI32x4:
+ curr = allocator.alloc<Unary>();
+ curr->op = WidenHighUVecI32x4ToVecI64x2;
+ break;
default:
return false;
}
@@ -5101,6 +5125,22 @@ bool WasmBinaryBuilder::maybeVisitSIMDTernary(Expression*& out, uint32_t code) {
curr = allocator.alloc<SIMDTernary>();
curr->op = Bitselect;
break;
+ case BinaryConsts::V8x16SignSelect:
+ curr = allocator.alloc<SIMDTernary>();
+ curr->op = SignSelectVec8x16;
+ break;
+ case BinaryConsts::V16x8SignSelect:
+ curr = allocator.alloc<SIMDTernary>();
+ curr->op = SignSelectVec16x8;
+ break;
+ case BinaryConsts::V32x4SignSelect:
+ curr = allocator.alloc<SIMDTernary>();
+ curr->op = SignSelectVec32x4;
+ break;
+ case BinaryConsts::V64x2SignSelect:
+ curr = allocator.alloc<SIMDTernary>();
+ curr->op = SignSelectVec64x2;
+ break;
case BinaryConsts::F32x4QFMA:
curr = allocator.alloc<SIMDTernary>();
curr->op = QFMAF32x4;
diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp
index 741aef5ce..3a24d0cc0 100644
--- a/src/wasm/wasm-stack.cpp
+++ b/src/wasm/wasm-stack.cpp
@@ -560,6 +560,18 @@ void BinaryInstWriter::visitSIMDTernary(SIMDTernary* curr) {
case QFMSF64x2:
o << U32LEB(BinaryConsts::F64x2QFMS);
break;
+ case SignSelectVec8x16:
+ o << U32LEB(BinaryConsts::V8x16SignSelect);
+ break;
+ case SignSelectVec16x8:
+ o << U32LEB(BinaryConsts::V16x8SignSelect);
+ break;
+ case SignSelectVec32x4:
+ o << U32LEB(BinaryConsts::V32x4SignSelect);
+ break;
+ case SignSelectVec64x2:
+ o << U32LEB(BinaryConsts::V64x2SignSelect);
+ break;
}
}
@@ -1024,6 +1036,10 @@ void BinaryInstWriter::visitUnary(Unary* curr) {
o << int8_t(BinaryConsts::SIMDPrefix)
<< U32LEB(BinaryConsts::I64x2AllTrue);
break;
+ case BitmaskVecI64x2:
+ o << int8_t(BinaryConsts::SIMDPrefix)
+ << U32LEB(BinaryConsts::I64x2Bitmask);
+ break;
case AbsVecF32x4:
o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F32x4Abs);
break;
@@ -1132,6 +1148,22 @@ void BinaryInstWriter::visitUnary(Unary* curr) {
o << int8_t(BinaryConsts::SIMDPrefix)
<< U32LEB(BinaryConsts::I32x4WidenHighUI16x8);
break;
+ case WidenLowSVecI32x4ToVecI64x2:
+ o << int8_t(BinaryConsts::SIMDPrefix)
+ << U32LEB(BinaryConsts::I64x2WidenLowSI32x4);
+ break;
+ case WidenHighSVecI32x4ToVecI64x2:
+ o << int8_t(BinaryConsts::SIMDPrefix)
+ << U32LEB(BinaryConsts::I64x2WidenHighSI32x4);
+ break;
+ case WidenLowUVecI32x4ToVecI64x2:
+ o << int8_t(BinaryConsts::SIMDPrefix)
+ << U32LEB(BinaryConsts::I64x2WidenLowUI32x4);
+ break;
+ case WidenHighUVecI32x4ToVecI64x2:
+ o << int8_t(BinaryConsts::SIMDPrefix)
+ << U32LEB(BinaryConsts::I64x2WidenHighUI32x4);
+ break;
case InvalidUnary:
WASM_UNREACHABLE("invalid unary op");
}
@@ -1461,6 +1493,9 @@ void BinaryInstWriter::visitBinary(Binary* curr) {
case GeUVecI32x4:
o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I32x4GeU);
break;
+ case EqVecI64x2:
+ o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I64x2Eq);
+ break;
case EqVecF32x4:
o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F32x4Eq);
break;
diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp
index 56cf9c114..b294c953c 100644
--- a/src/wasm/wasm-validator.cpp
+++ b/src/wasm/wasm-validator.cpp
@@ -1534,6 +1534,7 @@ void FunctionValidator::visitBinary(Binary* curr) {
case GtUVecI32x4:
case GeSVecI32x4:
case GeUVecI32x4:
+ case EqVecI64x2:
case EqVecF32x4:
case NeVecF32x4:
case LtVecF32x4:
@@ -1880,6 +1881,10 @@ void FunctionValidator::visitUnary(Unary* curr) {
case WidenHighSVecI16x8ToVecI32x4:
case WidenLowUVecI16x8ToVecI32x4:
case WidenHighUVecI16x8ToVecI32x4:
+ case WidenLowSVecI32x4ToVecI64x2:
+ case WidenHighSVecI32x4ToVecI64x2:
+ case WidenLowUVecI32x4ToVecI64x2:
+ case WidenHighUVecI32x4ToVecI64x2:
shouldBeEqual(curr->type, Type(Type::v128), curr, "expected v128 type");
shouldBeEqual(
curr->value->type, Type(Type::v128), curr, "expected v128 operand");
@@ -1895,6 +1900,7 @@ void FunctionValidator::visitUnary(Unary* curr) {
case BitmaskVecI8x16:
case BitmaskVecI16x8:
case BitmaskVecI32x4:
+ case BitmaskVecI64x2:
shouldBeEqual(curr->type, Type(Type::i32), curr, "expected i32 type");
shouldBeEqual(
curr->value->type, Type(Type::v128), curr, "expected v128 operand");
diff --git a/src/wasm/wasm.cpp b/src/wasm/wasm.cpp
index 93a14aecc..8e6550c27 100644
--- a/src/wasm/wasm.cpp
+++ b/src/wasm/wasm.cpp
@@ -869,6 +869,10 @@ void Unary::finalize() {
case WidenHighSVecI16x8ToVecI32x4:
case WidenLowUVecI16x8ToVecI32x4:
case WidenHighUVecI16x8ToVecI32x4:
+ case WidenLowSVecI32x4ToVecI64x2:
+ case WidenHighSVecI32x4ToVecI64x2:
+ case WidenLowUVecI32x4ToVecI64x2:
+ case WidenHighUVecI32x4ToVecI64x2:
type = Type::v128;
break;
case AnyTrueVecI8x16:
@@ -882,6 +886,7 @@ void Unary::finalize() {
case BitmaskVecI8x16:
case BitmaskVecI16x8:
case BitmaskVecI32x4:
+ case BitmaskVecI64x2:
type = Type::i32;
break;