summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Lively <7121787+tlively@users.noreply.github.com>2020-06-05 10:46:23 -0700
committerGitHub <noreply@github.com>2020-06-05 10:46:23 -0700
commit037d7a5d04c376b2fa8fc26076af9579c3712063 (patch)
tree510e3023d8472e1d235b0002adff963fae89009e /src
parent0c58de1d350928e5e45594e4642349dc77697725 (diff)
downloadbinaryen-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.cpp8
-rw-r--r--src/binaryen-c.h8
-rw-r--r--src/gen-s-parser.inc58
-rw-r--r--src/ir/cost.h8
-rw-r--r--src/js/binaryen.js-post.js32
-rw-r--r--src/literal.h8
-rw-r--r--src/passes/Print.cpp24
-rw-r--r--src/wasm-binary.h9
-rw-r--r--src/wasm-interpreter.h16
-rw-r--r--src/wasm.h8
-rw-r--r--src/wasm/literal.cpp24
-rw-r--r--src/wasm/wasm-binary.cpp32
-rw-r--r--src/wasm/wasm-stack.cpp26
-rw-r--r--src/wasm/wasm-validator.cpp8
-rw-r--r--src/wasm/wasm.cpp8
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: