diff options
author | Ng Zhi An <zhin@chromium.org> | 2021-11-15 13:43:43 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-15 13:43:43 -0800 |
commit | 3549e3040340c706349b1ee9ab3e994279805afc (patch) | |
tree | 4764d49a6c0ec600102dd07ec677c6755b6da338 /src/wasm/wasm-validator.cpp | |
parent | ed1f0d8427f330a18b2ca98adeadcb1be56d59bc (diff) | |
download | binaryen-3549e3040340c706349b1ee9ab3e994279805afc.tar.gz binaryen-3549e3040340c706349b1ee9ab3e994279805afc.tar.bz2 binaryen-3549e3040340c706349b1ee9ab3e994279805afc.zip |
Add support for relaxed-simd instructions (#4320)
This adds relaxed-simd instructions based on the current status of the
proposal
https://github.com/WebAssembly/relaxed-simd/blob/main/proposals/relaxed-simd/Overview.md.
Binary opcodes are based on what is listed in
https://github.com/WebAssembly/relaxed-simd/blob/main/proposals/relaxed-simd/Overview.md#binary-format.
Text names are not fixed yet, and some sort sort of names that maps to
the non-relaxed versions are chosen for this prototype.
Support for these instructions have been added to LLVM via builtins,
adding support here will allow Emscripten to successfully compile files
that use those builtins.
Interpreter support has also been added, and they delegate to the
non-relaxed versions of the instructions.
Most instructions are implemented in the interpreter the same way as the non-relaxed
simd128 instructions, except for fma/fms, which is always fused.
Diffstat (limited to 'src/wasm/wasm-validator.cpp')
-rw-r--r-- | src/wasm/wasm-validator.cpp | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp index 86b537bf5..696c50d8b 100644 --- a/src/wasm/wasm-validator.cpp +++ b/src/wasm/wasm-validator.cpp @@ -1613,6 +1613,8 @@ void FunctionValidator::visitBinary(Binary* curr) { case MaxVecF32x4: case PMinVecF32x4: case PMaxVecF32x4: + case RelaxedMinVecF32x4: + case RelaxedMaxVecF32x4: case AddVecF64x2: case SubVecF64x2: case MulVecF64x2: @@ -1621,11 +1623,14 @@ void FunctionValidator::visitBinary(Binary* curr) { case MaxVecF64x2: case PMinVecF64x2: case PMaxVecF64x2: + case RelaxedMinVecF64x2: + case RelaxedMaxVecF64x2: case NarrowSVecI16x8ToVecI8x16: case NarrowUVecI16x8ToVecI8x16: case NarrowSVecI32x4ToVecI16x8: case NarrowUVecI32x4ToVecI16x8: - case SwizzleVec8x16: { + case SwizzleVec8x16: + case RelaxedSwizzleVec8x16: { shouldBeEqualOrFirstIsUnreachable( curr->left->type, Type(Type::v128), curr, "v128 op"); shouldBeEqualOrFirstIsUnreachable( @@ -1898,6 +1903,10 @@ void FunctionValidator::visitUnary(Unary* curr) { case TruncSatZeroUVecF64x2ToVecI32x4: case DemoteZeroVecF64x2ToVecF32x4: case PromoteLowVecF32x4ToVecF64x2: + case RelaxedTruncSVecF32x4ToVecI32x4: + case RelaxedTruncUVecF32x4ToVecI32x4: + case RelaxedTruncZeroSVecF64x2ToVecI32x4: + case RelaxedTruncZeroUVecF64x2ToVecI32x4: shouldBeEqual(curr->type, Type(Type::v128), curr, "expected v128 type"); shouldBeEqual( curr->value->type, Type(Type::v128), curr, "expected v128 operand"); |