diff options
Diffstat (limited to 'src/wasm')
-rw-r--r-- | src/wasm/literal.cpp | 4 | ||||
-rw-r--r-- | src/wasm/wasm-binary.cpp | 40 | ||||
-rw-r--r-- | src/wasm/wasm-stack.cpp | 35 | ||||
-rw-r--r-- | src/wasm/wasm-validator.cpp | 6 | ||||
-rw-r--r-- | src/wasm/wasm.cpp | 5 |
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; |