diff options
author | Thomas Lively <7121787+tlively@users.noreply.github.com> | 2020-06-05 10:46:23 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-05 10:46:23 -0700 |
commit | 037d7a5d04c376b2fa8fc26076af9579c3712063 (patch) | |
tree | 510e3023d8472e1d235b0002adff963fae89009e /src | |
parent | 0c58de1d350928e5e45594e4642349dc77697725 (diff) | |
download | binaryen-037d7a5d04c376b2fa8fc26076af9579c3712063.tar.gz binaryen-037d7a5d04c376b2fa8fc26076af9579c3712063.tar.bz2 binaryen-037d7a5d04c376b2fa8fc26076af9579c3712063.zip |
Add prototype SIMD rounding instructions (#2895)
As specified in https://github.com/WebAssembly/simd/pull/232.
Diffstat (limited to 'src')
-rw-r--r-- | src/binaryen-c.cpp | 8 | ||||
-rw-r--r-- | src/binaryen-c.h | 8 | ||||
-rw-r--r-- | src/gen-s-parser.inc | 58 | ||||
-rw-r--r-- | src/ir/cost.h | 8 | ||||
-rw-r--r-- | src/js/binaryen.js-post.js | 32 | ||||
-rw-r--r-- | src/literal.h | 8 | ||||
-rw-r--r-- | src/passes/Print.cpp | 24 | ||||
-rw-r--r-- | src/wasm-binary.h | 9 | ||||
-rw-r--r-- | src/wasm-interpreter.h | 16 | ||||
-rw-r--r-- | src/wasm.h | 8 | ||||
-rw-r--r-- | src/wasm/literal.cpp | 24 | ||||
-rw-r--r-- | src/wasm/wasm-binary.cpp | 32 | ||||
-rw-r--r-- | src/wasm/wasm-stack.cpp | 26 | ||||
-rw-r--r-- | src/wasm/wasm-validator.cpp | 8 | ||||
-rw-r--r-- | src/wasm/wasm.cpp | 8 |
15 files changed, 265 insertions, 12 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index 96edb4c21..e6155bad3 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -682,6 +682,10 @@ BinaryenOp BinaryenDivVecF32x4(void) { return DivVecF32x4; } BinaryenOp BinaryenMinVecF32x4(void) { return MinVecF32x4; } BinaryenOp BinaryenMaxVecF32x4(void) { return MaxVecF32x4; } BinaryenOp BinaryenPMinVecF32x4(void) { return PMinVecF32x4; } +BinaryenOp BinaryenCeilVecF32x4(void) { return CeilVecF32x4; } +BinaryenOp BinaryenFloorVecF32x4(void) { return FloorVecF32x4; } +BinaryenOp BinaryenTruncVecF32x4(void) { return TruncVecF32x4; } +BinaryenOp BinaryenNearestVecF32x4(void) { return NearestVecF32x4; } BinaryenOp BinaryenPMaxVecF32x4(void) { return PMaxVecF32x4; } BinaryenOp BinaryenAbsVecF64x2(void) { return AbsVecF64x2; } BinaryenOp BinaryenNegVecF64x2(void) { return NegVecF64x2; } @@ -696,6 +700,10 @@ BinaryenOp BinaryenMinVecF64x2(void) { return MinVecF64x2; } BinaryenOp BinaryenMaxVecF64x2(void) { return MaxVecF64x2; } BinaryenOp BinaryenPMinVecF64x2(void) { return PMinVecF64x2; } BinaryenOp BinaryenPMaxVecF64x2(void) { return PMaxVecF64x2; } +BinaryenOp BinaryenCeilVecF64x2(void) { return CeilVecF64x2; } +BinaryenOp BinaryenFloorVecF64x2(void) { return FloorVecF64x2; } +BinaryenOp BinaryenTruncVecF64x2(void) { return TruncVecF64x2; } +BinaryenOp BinaryenNearestVecF64x2(void) { return NearestVecF64x2; } BinaryenOp BinaryenTruncSatSVecF32x4ToVecI32x4(void) { return TruncSatSVecF32x4ToVecI32x4; } diff --git a/src/binaryen-c.h b/src/binaryen-c.h index 9fd08f968..e52d5f46a 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -543,6 +543,10 @@ BINARYEN_API BinaryenOp BinaryenMinVecF32x4(void); BINARYEN_API BinaryenOp BinaryenMaxVecF32x4(void); BINARYEN_API BinaryenOp BinaryenPMinVecF32x4(void); BINARYEN_API BinaryenOp BinaryenPMaxVecF32x4(void); +BINARYEN_API BinaryenOp BinaryenCeilVecF32x4(void); +BINARYEN_API BinaryenOp BinaryenFloorVecF32x4(void); +BINARYEN_API BinaryenOp BinaryenTruncVecF32x4(void); +BINARYEN_API BinaryenOp BinaryenNearestVecF32x4(void); BINARYEN_API BinaryenOp BinaryenAbsVecF64x2(void); BINARYEN_API BinaryenOp BinaryenNegVecF64x2(void); BINARYEN_API BinaryenOp BinaryenSqrtVecF64x2(void); @@ -556,6 +560,10 @@ BINARYEN_API BinaryenOp BinaryenMinVecF64x2(void); BINARYEN_API BinaryenOp BinaryenMaxVecF64x2(void); BINARYEN_API BinaryenOp BinaryenPMinVecF64x2(void); BINARYEN_API BinaryenOp BinaryenPMaxVecF64x2(void); +BINARYEN_API BinaryenOp BinaryenCeilVecF64x2(void); +BINARYEN_API BinaryenOp BinaryenFloorVecF64x2(void); +BINARYEN_API BinaryenOp BinaryenTruncVecF64x2(void); +BINARYEN_API BinaryenOp BinaryenNearestVecF64x2(void); BINARYEN_API BinaryenOp BinaryenTruncSatSVecF32x4ToVecI32x4(void); BINARYEN_API BinaryenOp BinaryenTruncSatUVecF32x4ToVecI32x4(void); BINARYEN_API BinaryenOp BinaryenTruncSatSVecF64x2ToVecI64x2(void); diff --git a/src/gen-s-parser.inc b/src/gen-s-parser.inc index 3a7569a61..c7a703aea 100644 --- a/src/gen-s-parser.inc +++ b/src/gen-s-parser.inc @@ -267,13 +267,21 @@ switch (op[0]) { } } case 'c': { - switch (op[20]) { - case 's': - if (strcmp(op, "f32x4.convert_i32x4_s") == 0) { return makeUnary(s, UnaryOp::ConvertSVecI32x4ToVecF32x4); } - goto parse_error; - case 'u': - if (strcmp(op, "f32x4.convert_i32x4_u") == 0) { return makeUnary(s, UnaryOp::ConvertUVecI32x4ToVecF32x4); } + switch (op[7]) { + case 'e': + if (strcmp(op, "f32x4.ceil") == 0) { return makeUnary(s, UnaryOp::CeilVecF32x4); } goto parse_error; + case 'o': { + switch (op[20]) { + case 's': + if (strcmp(op, "f32x4.convert_i32x4_s") == 0) { return makeUnary(s, UnaryOp::ConvertSVecI32x4ToVecF32x4); } + goto parse_error; + case 'u': + if (strcmp(op, "f32x4.convert_i32x4_u") == 0) { return makeUnary(s, UnaryOp::ConvertUVecI32x4ToVecF32x4); } + goto parse_error; + default: goto parse_error; + } + } default: goto parse_error; } } @@ -291,6 +299,9 @@ switch (op[0]) { default: goto parse_error; } } + case 'f': + if (strcmp(op, "f32x4.floor") == 0) { return makeUnary(s, UnaryOp::FloorVecF32x4); } + goto parse_error; case 'g': { switch (op[7]) { case 'e': @@ -332,6 +343,9 @@ switch (op[0]) { case '\0': if (strcmp(op, "f32x4.ne") == 0) { return makeBinary(s, BinaryOp::NeVecF32x4); } goto parse_error; + case 'a': + if (strcmp(op, "f32x4.nearest") == 0) { return makeUnary(s, UnaryOp::NearestVecF32x4); } + goto parse_error; case 'g': if (strcmp(op, "f32x4.neg") == 0) { return makeUnary(s, UnaryOp::NegVecF32x4); } goto parse_error; @@ -377,6 +391,9 @@ switch (op[0]) { default: goto parse_error; } } + case 't': + if (strcmp(op, "f32x4.trunc") == 0) { return makeUnary(s, UnaryOp::TruncVecF32x4); } + goto parse_error; default: goto parse_error; } } @@ -559,13 +576,21 @@ switch (op[0]) { } } case 'c': { - switch (op[20]) { - case 's': - if (strcmp(op, "f64x2.convert_i64x2_s") == 0) { return makeUnary(s, UnaryOp::ConvertSVecI64x2ToVecF64x2); } - goto parse_error; - case 'u': - if (strcmp(op, "f64x2.convert_i64x2_u") == 0) { return makeUnary(s, UnaryOp::ConvertUVecI64x2ToVecF64x2); } + switch (op[7]) { + case 'e': + if (strcmp(op, "f64x2.ceil") == 0) { return makeUnary(s, UnaryOp::CeilVecF64x2); } goto parse_error; + case 'o': { + switch (op[20]) { + case 's': + if (strcmp(op, "f64x2.convert_i64x2_s") == 0) { return makeUnary(s, UnaryOp::ConvertSVecI64x2ToVecF64x2); } + goto parse_error; + case 'u': + if (strcmp(op, "f64x2.convert_i64x2_u") == 0) { return makeUnary(s, UnaryOp::ConvertUVecI64x2ToVecF64x2); } + goto parse_error; + default: goto parse_error; + } + } default: goto parse_error; } } @@ -583,6 +608,9 @@ switch (op[0]) { default: goto parse_error; } } + case 'f': + if (strcmp(op, "f64x2.floor") == 0) { return makeUnary(s, UnaryOp::FloorVecF64x2); } + goto parse_error; case 'g': { switch (op[7]) { case 'e': @@ -624,6 +652,9 @@ switch (op[0]) { case '\0': if (strcmp(op, "f64x2.ne") == 0) { return makeBinary(s, BinaryOp::NeVecF64x2); } goto parse_error; + case 'a': + if (strcmp(op, "f64x2.nearest") == 0) { return makeUnary(s, UnaryOp::NearestVecF64x2); } + goto parse_error; case 'g': if (strcmp(op, "f64x2.neg") == 0) { return makeUnary(s, UnaryOp::NegVecF64x2); } goto parse_error; @@ -669,6 +700,9 @@ switch (op[0]) { default: goto parse_error; } } + case 't': + if (strcmp(op, "f64x2.trunc") == 0) { return makeUnary(s, UnaryOp::TruncVecF64x2); } + goto parse_error; default: goto parse_error; } } diff --git a/src/ir/cost.h b/src/ir/cost.h index f890e8910..ea3e32909 100644 --- a/src/ir/cost.h +++ b/src/ir/cost.h @@ -173,9 +173,17 @@ struct CostAnalyzer : public Visitor<CostAnalyzer, Index> { case AbsVecF32x4: case NegVecF32x4: case SqrtVecF32x4: + case CeilVecF32x4: + case FloorVecF32x4: + case TruncVecF32x4: + case NearestVecF32x4: case AbsVecF64x2: case NegVecF64x2: case SqrtVecF64x2: + case CeilVecF64x2: + case FloorVecF64x2: + case TruncVecF64x2: + case NearestVecF64x2: case TruncSatSVecF32x4ToVecI32x4: case TruncSatUVecF32x4ToVecI32x4: case TruncSatSVecF64x2ToVecI64x2: diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js index 2d7bd3f36..dfdb05457 100644 --- a/src/js/binaryen.js-post.js +++ b/src/js/binaryen.js-post.js @@ -423,6 +423,10 @@ function initializeConstants() { 'MaxVecF32x4', 'PMinVecF32x4', 'PMaxVecF32x4', + 'CeilVecF32x4', + 'FloorVecF32x4', + 'TruncVecF32x4', + 'NearestVecF32x4', 'AbsVecF64x2', 'NegVecF64x2', 'SqrtVecF64x2', @@ -436,6 +440,10 @@ function initializeConstants() { 'MaxVecF64x2', 'PMinVecF64x2', 'PMaxVecF64x2', + 'CeilVecF64x2', + 'FloorVecF64x2', + 'TruncVecF64x2', + 'NearestVecF64x2', 'TruncSatSVecF32x4ToVecI32x4', 'TruncSatUVecF32x4ToVecI32x4', 'TruncSatSVecF64x2ToVecI64x2', @@ -1918,6 +1926,18 @@ function wrapModule(module, self) { 'pmax': function(left, right) { return Module['_BinaryenBinary'](module, Module['PMaxVecF32x4'], left, right); }, + 'ceil': function(value) { + return Module['_BinaryenUnary'](module, Module['CeilVecF32x4'], value); + }, + 'floor': function(value) { + return Module['_BinaryenUnary'](module, Module['FloorVecF32x4'], value); + }, + 'trunc': function(value) { + return Module['_BinaryenUnary'](module, Module['TruncVecF32x4'], value); + }, + 'nearest': function(value) { + return Module['_BinaryenUnary'](module, Module['NearestVecF32x4'], value); + }, 'convert_i32x4_s': function(value) { return Module['_BinaryenUnary'](module, Module['ConvertSVecI32x4ToVecF32x4'], value); }, @@ -1993,6 +2013,18 @@ function wrapModule(module, self) { 'pmax': function(left, right) { return Module['_BinaryenBinary'](module, Module['PMaxVecF64x2'], left, right); }, + 'ceil': function(value) { + return Module['_BinaryenUnary'](module, Module['CeilVecF64x2'], value); + }, + 'floor': function(value) { + return Module['_BinaryenUnary'](module, Module['FloorVecF64x2'], value); + }, + 'trunc': function(value) { + return Module['_BinaryenUnary'](module, Module['TruncVecF64x2'], value); + }, + 'nearest': function(value) { + return Module['_BinaryenUnary'](module, Module['NearestVecF64x2'], value); + }, 'convert_i64x2_s': function(value) { return Module['_BinaryenUnary'](module, Module['ConvertSVecI64x2ToVecF64x2'], value); }, diff --git a/src/literal.h b/src/literal.h index 2295a126e..8bfee38c1 100644 --- a/src/literal.h +++ b/src/literal.h @@ -429,6 +429,10 @@ public: Literal maxF32x4(const Literal& other) const; Literal pminF32x4(const Literal& other) const; Literal pmaxF32x4(const Literal& other) const; + Literal ceilF32x4() const; + Literal floorF32x4() const; + Literal truncF32x4() const; + Literal nearestF32x4() const; Literal absF64x2() const; Literal negF64x2() const; Literal sqrtF64x2() const; @@ -440,6 +444,10 @@ public: Literal maxF64x2(const Literal& other) const; Literal pminF64x2(const Literal& other) const; Literal pmaxF64x2(const Literal& other) const; + Literal ceilF64x2() const; + Literal floorF64x2() const; + Literal truncF64x2() const; + Literal nearestF64x2() const; Literal truncSatToSI32x4() const; Literal truncSatToUI32x4() const; Literal truncSatToSI64x2() const; diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp index efa31cac0..6246a5f5a 100644 --- a/src/passes/Print.cpp +++ b/src/passes/Print.cpp @@ -780,6 +780,18 @@ struct PrintExpressionContents case SqrtVecF32x4: o << "f32x4.sqrt"; break; + case CeilVecF32x4: + o << "f32x4.ceil"; + break; + case FloorVecF32x4: + o << "f32x4.floor"; + break; + case TruncVecF32x4: + o << "f32x4.trunc"; + break; + case NearestVecF32x4: + o << "f32x4.nearest"; + break; case AbsVecF64x2: o << "f64x2.abs"; break; @@ -789,6 +801,18 @@ struct PrintExpressionContents case SqrtVecF64x2: o << "f64x2.sqrt"; break; + case CeilVecF64x2: + o << "f64x2.ceil"; + break; + case FloorVecF64x2: + o << "f64x2.floor"; + break; + case TruncVecF64x2: + o << "f64x2.trunc"; + break; + case NearestVecF64x2: + o << "f64x2.nearest"; + break; case TruncSatSVecF32x4ToVecI32x4: o << "i32x4.trunc_sat_f32x4_s"; break; diff --git a/src/wasm-binary.h b/src/wasm-binary.h index 995adde2a..b8d14377d 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -862,6 +862,15 @@ enum ASTNodes { F32x4PMin = 0xea, F32x4PMax = 0xeb, + F32x4Ceil = 0xd8, + F32x4Floor = 0xd9, + F32x4Trunc = 0xda, + F32x4Nearest = 0xdb, + F64x2Ceil = 0xdc, + F64x2Floor = 0xdd, + F64x2Trunc = 0xde, + F64x2Nearest = 0xdf, + F64x2Abs = 0xec, F64x2Neg = 0xed, F64x2Sqrt = 0xef, diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index c47786a08..86ea7e146 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -495,12 +495,28 @@ public: return value.negF32x4(); case SqrtVecF32x4: return value.sqrtF32x4(); + case CeilVecF32x4: + return value.ceilF32x4(); + case FloorVecF32x4: + return value.floorF32x4(); + case TruncVecF32x4: + return value.truncF32x4(); + case NearestVecF32x4: + return value.nearestF32x4(); case AbsVecF64x2: return value.absF64x2(); case NegVecF64x2: return value.negF64x2(); case SqrtVecF64x2: return value.sqrtF64x2(); + case CeilVecF64x2: + return value.ceilF64x2(); + case FloorVecF64x2: + return value.floorF64x2(); + case TruncVecF64x2: + return value.truncF64x2(); + case NearestVecF64x2: + return value.nearestF64x2(); case TruncSatSVecF32x4ToVecI32x4: return value.truncSatToSI32x4(); case TruncSatUVecF32x4ToVecI32x4: diff --git a/src/wasm.h b/src/wasm.h index 0afe5ab28..a1c386289 100644 --- a/src/wasm.h +++ b/src/wasm.h @@ -177,9 +177,17 @@ enum UnaryOp { AbsVecF32x4, NegVecF32x4, SqrtVecF32x4, + CeilVecF32x4, + FloorVecF32x4, + TruncVecF32x4, + NearestVecF32x4, AbsVecF64x2, NegVecF64x2, SqrtVecF64x2, + CeilVecF64x2, + FloorVecF64x2, + TruncVecF64x2, + NearestVecF64x2, // SIMD conversions TruncSatSVecF32x4ToVecI32x4, diff --git a/src/wasm/literal.cpp b/src/wasm/literal.cpp index 3326adc74..5aebf30a3 100644 --- a/src/wasm/literal.cpp +++ b/src/wasm/literal.cpp @@ -1531,6 +1531,18 @@ Literal Literal::negF32x4() const { Literal Literal::sqrtF32x4() const { return unary<4, &Literal::getLanesF32x4, &Literal::sqrt>(*this); } +Literal Literal::ceilF32x4() const { + return unary<4, &Literal::getLanesF32x4, &Literal::ceil>(*this); +} +Literal Literal::floorF32x4() const { + return unary<4, &Literal::getLanesF32x4, &Literal::floor>(*this); +} +Literal Literal::truncF32x4() const { + return unary<4, &Literal::getLanesF32x4, &Literal::trunc>(*this); +} +Literal Literal::nearestF32x4() const { + return unary<4, &Literal::getLanesF32x4, &Literal::nearbyint>(*this); +} Literal Literal::absF64x2() const { return unary<2, &Literal::getLanesF64x2, &Literal::abs>(*this); } @@ -1540,6 +1552,18 @@ Literal Literal::negF64x2() const { Literal Literal::sqrtF64x2() const { return unary<2, &Literal::getLanesF64x2, &Literal::sqrt>(*this); } +Literal Literal::ceilF64x2() const { + return unary<2, &Literal::getLanesF64x2, &Literal::ceil>(*this); +} +Literal Literal::floorF64x2() const { + return unary<2, &Literal::getLanesF64x2, &Literal::floor>(*this); +} +Literal Literal::truncF64x2() const { + return unary<2, &Literal::getLanesF64x2, &Literal::trunc>(*this); +} +Literal Literal::nearestF64x2() const { + return unary<2, &Literal::getLanesF64x2, &Literal::nearbyint>(*this); +} Literal Literal::truncSatToSI32x4() const { return unary<4, &Literal::getLanesF32x4, &Literal::truncSatToSI32>(*this); } diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 3441953a7..a766e9b63 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -4194,6 +4194,22 @@ bool WasmBinaryBuilder::maybeVisitSIMDUnary(Expression*& out, uint32_t code) { curr = allocator.alloc<Unary>(); curr->op = SqrtVecF32x4; break; + case BinaryConsts::F32x4Ceil: + curr = allocator.alloc<Unary>(); + curr->op = CeilVecF32x4; + break; + case BinaryConsts::F32x4Floor: + curr = allocator.alloc<Unary>(); + curr->op = FloorVecF32x4; + break; + case BinaryConsts::F32x4Trunc: + curr = allocator.alloc<Unary>(); + curr->op = TruncVecF32x4; + break; + case BinaryConsts::F32x4Nearest: + curr = allocator.alloc<Unary>(); + curr->op = NearestVecF32x4; + break; case BinaryConsts::F64x2Abs: curr = allocator.alloc<Unary>(); curr->op = AbsVecF64x2; @@ -4206,6 +4222,22 @@ bool WasmBinaryBuilder::maybeVisitSIMDUnary(Expression*& out, uint32_t code) { curr = allocator.alloc<Unary>(); curr->op = SqrtVecF64x2; break; + case BinaryConsts::F64x2Ceil: + curr = allocator.alloc<Unary>(); + curr->op = CeilVecF64x2; + break; + case BinaryConsts::F64x2Floor: + curr = allocator.alloc<Unary>(); + curr->op = FloorVecF64x2; + break; + case BinaryConsts::F64x2Trunc: + curr = allocator.alloc<Unary>(); + curr->op = TruncVecF64x2; + break; + case BinaryConsts::F64x2Nearest: + curr = allocator.alloc<Unary>(); + curr->op = NearestVecF64x2; + break; case BinaryConsts::I32x4TruncSatSF32x4: curr = allocator.alloc<Unary>(); curr->op = TruncSatSVecF32x4ToVecI32x4; diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp index 58fa3f2ef..9ebf39fb8 100644 --- a/src/wasm/wasm-stack.cpp +++ b/src/wasm/wasm-stack.cpp @@ -981,6 +981,19 @@ void BinaryInstWriter::visitUnary(Unary* curr) { case SqrtVecF32x4: o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F32x4Sqrt); break; + case CeilVecF32x4: + o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F32x4Ceil); + break; + case FloorVecF32x4: + o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F32x4Floor); + break; + case TruncVecF32x4: + o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F32x4Trunc); + break; + case NearestVecF32x4: + o << int8_t(BinaryConsts::SIMDPrefix) + << U32LEB(BinaryConsts::F32x4Nearest); + break; case AbsVecF64x2: o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F64x2Abs); break; @@ -990,6 +1003,19 @@ void BinaryInstWriter::visitUnary(Unary* curr) { case SqrtVecF64x2: o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F64x2Sqrt); break; + case CeilVecF64x2: + o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F64x2Ceil); + break; + case FloorVecF64x2: + o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F64x2Floor); + break; + case TruncVecF64x2: + o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F64x2Trunc); + break; + case NearestVecF64x2: + o << int8_t(BinaryConsts::SIMDPrefix) + << U32LEB(BinaryConsts::F64x2Nearest); + break; case TruncSatSVecF32x4ToVecI32x4: o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I32x4TruncSatSF32x4); diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp index 606cb47a8..97e45d471 100644 --- a/src/wasm/wasm-validator.cpp +++ b/src/wasm/wasm-validator.cpp @@ -1704,9 +1704,17 @@ void FunctionValidator::visitUnary(Unary* curr) { case AbsVecF32x4: case NegVecF32x4: case SqrtVecF32x4: + case CeilVecF32x4: + case FloorVecF32x4: + case TruncVecF32x4: + case NearestVecF32x4: case AbsVecF64x2: case NegVecF64x2: case SqrtVecF64x2: + case CeilVecF64x2: + case FloorVecF64x2: + case TruncVecF64x2: + case NearestVecF64x2: case TruncSatSVecF32x4ToVecI32x4: case TruncSatUVecF32x4ToVecI32x4: case TruncSatSVecF64x2ToVecI64x2: diff --git a/src/wasm/wasm.cpp b/src/wasm/wasm.cpp index 704e48e88..6f86a13ac 100644 --- a/src/wasm/wasm.cpp +++ b/src/wasm/wasm.cpp @@ -746,9 +746,17 @@ void Unary::finalize() { case AbsVecF32x4: case NegVecF32x4: case SqrtVecF32x4: + case CeilVecF32x4: + case FloorVecF32x4: + case TruncVecF32x4: + case NearestVecF32x4: case AbsVecF64x2: case NegVecF64x2: case SqrtVecF64x2: + case CeilVecF64x2: + case FloorVecF64x2: + case TruncVecF64x2: + case NearestVecF64x2: case TruncSatSVecF32x4ToVecI32x4: case TruncSatUVecF32x4ToVecI32x4: case TruncSatSVecF64x2ToVecI64x2: |