summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xscripts/gen-s-parser.py4
-rw-r--r--src/binaryen-c.cpp4
-rw-r--r--src/binaryen-c.h4
-rw-r--r--src/gen-s-parser.inc22
-rw-r--r--src/ir/cost.h12
-rw-r--r--src/js/binaryen.js-post.js16
-rw-r--r--src/literal.h6
-rw-r--r--src/passes/Print.cpp12
-rw-r--r--src/wasm-binary.h4
-rw-r--r--src/wasm-interpreter.h8
-rw-r--r--src/wasm.h4
-rw-r--r--src/wasm/literal.cpp32
-rw-r--r--src/wasm/wasm-binary.cpp16
-rw-r--r--src/wasm/wasm-stack.cpp12
-rw-r--r--src/wasm/wasm-validator.cpp4
-rw-r--r--test/binaryen.js/kitchen-sink.js4
-rw-r--r--test/binaryen.js/kitchen-sink.js.txt48
-rw-r--r--test/example/c-api-kitchen-sink.c4
-rw-r--r--test/example/c-api-kitchen-sink.txt24
-rw-r--r--test/simd.wast24
-rw-r--r--test/simd.wast.from-wast24
-rw-r--r--test/simd.wast.fromBinary24
-rw-r--r--test/simd.wast.fromBinary.noDebugInfo118
-rw-r--r--test/spec/simd.wast10
24 files changed, 393 insertions, 47 deletions
diff --git a/scripts/gen-s-parser.py b/scripts/gen-s-parser.py
index cbc7307c8..fe6513de2 100755
--- a/scripts/gen-s-parser.py
+++ b/scripts/gen-s-parser.py
@@ -435,6 +435,8 @@ instructions = [
("f32x4.div", "makeBinary(s, BinaryOp::DivVecF32x4)"),
("f32x4.min", "makeBinary(s, BinaryOp::MinVecF32x4)"),
("f32x4.max", "makeBinary(s, BinaryOp::MaxVecF32x4)"),
+ ("f32x4.pmin", "makeBinary(s, BinaryOp::PMinVecF32x4)"),
+ ("f32x4.pmax", "makeBinary(s, BinaryOp::PMaxVecF32x4)"),
("f64x2.abs", "makeUnary(s, UnaryOp::AbsVecF64x2)"),
("f64x2.neg", "makeUnary(s, UnaryOp::NegVecF64x2)"),
("f64x2.sqrt", "makeUnary(s, UnaryOp::SqrtVecF64x2)"),
@@ -446,6 +448,8 @@ instructions = [
("f64x2.div", "makeBinary(s, BinaryOp::DivVecF64x2)"),
("f64x2.min", "makeBinary(s, BinaryOp::MinVecF64x2)"),
("f64x2.max", "makeBinary(s, BinaryOp::MaxVecF64x2)"),
+ ("f64x2.pmin", "makeBinary(s, BinaryOp::PMinVecF64x2)"),
+ ("f64x2.pmax", "makeBinary(s, BinaryOp::PMaxVecF64x2)"),
("i32x4.trunc_sat_f32x4_s", "makeUnary(s, UnaryOp::TruncSatSVecF32x4ToVecI32x4)"),
("i32x4.trunc_sat_f32x4_u", "makeUnary(s, UnaryOp::TruncSatUVecF32x4ToVecI32x4)"),
("i64x2.trunc_sat_f64x2_s", "makeUnary(s, UnaryOp::TruncSatSVecF64x2ToVecI64x2)"),
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index a64c46fbf..5f4ad2c40 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -681,6 +681,8 @@ BinaryenOp BinaryenMulVecF32x4(void) { return MulVecF32x4; }
BinaryenOp BinaryenDivVecF32x4(void) { return DivVecF32x4; }
BinaryenOp BinaryenMinVecF32x4(void) { return MinVecF32x4; }
BinaryenOp BinaryenMaxVecF32x4(void) { return MaxVecF32x4; }
+BinaryenOp BinaryenPMinVecF32x4(void) { return PMinVecF32x4; }
+BinaryenOp BinaryenPMaxVecF32x4(void) { return PMaxVecF32x4; }
BinaryenOp BinaryenAbsVecF64x2(void) { return AbsVecF64x2; }
BinaryenOp BinaryenNegVecF64x2(void) { return NegVecF64x2; }
BinaryenOp BinaryenSqrtVecF64x2(void) { return SqrtVecF64x2; }
@@ -692,6 +694,8 @@ BinaryenOp BinaryenMulVecF64x2(void) { return MulVecF64x2; }
BinaryenOp BinaryenDivVecF64x2(void) { return DivVecF64x2; }
BinaryenOp BinaryenMinVecF64x2(void) { return MinVecF64x2; }
BinaryenOp BinaryenMaxVecF64x2(void) { return MaxVecF64x2; }
+BinaryenOp BinaryenPMinVecF64x2(void) { return PMinVecF64x2; }
+BinaryenOp BinaryenPMaxVecF64x2(void) { return PMaxVecF64x2; }
BinaryenOp BinaryenTruncSatSVecF32x4ToVecI32x4(void) {
return TruncSatSVecF32x4ToVecI32x4;
}
diff --git a/src/binaryen-c.h b/src/binaryen-c.h
index e460671b9..7a33a4c3c 100644
--- a/src/binaryen-c.h
+++ b/src/binaryen-c.h
@@ -541,6 +541,8 @@ BINARYEN_API BinaryenOp BinaryenMulVecF32x4(void);
BINARYEN_API BinaryenOp BinaryenDivVecF32x4(void);
BINARYEN_API BinaryenOp BinaryenMinVecF32x4(void);
BINARYEN_API BinaryenOp BinaryenMaxVecF32x4(void);
+BINARYEN_API BinaryenOp BinaryenPMinVecF32x4(void);
+BINARYEN_API BinaryenOp BinaryenPMaxVecF32x4(void);
BINARYEN_API BinaryenOp BinaryenAbsVecF64x2(void);
BINARYEN_API BinaryenOp BinaryenNegVecF64x2(void);
BINARYEN_API BinaryenOp BinaryenSqrtVecF64x2(void);
@@ -552,6 +554,8 @@ BINARYEN_API BinaryenOp BinaryenMulVecF64x2(void);
BINARYEN_API BinaryenOp BinaryenDivVecF64x2(void);
BINARYEN_API BinaryenOp BinaryenMinVecF64x2(void);
BINARYEN_API BinaryenOp BinaryenMaxVecF64x2(void);
+BINARYEN_API BinaryenOp BinaryenPMinVecF64x2(void);
+BINARYEN_API BinaryenOp BinaryenPMaxVecF64x2(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 09a5070b9..351a3119f 100644
--- a/src/gen-s-parser.inc
+++ b/src/gen-s-parser.inc
@@ -338,6 +338,17 @@ switch (op[0]) {
default: goto parse_error;
}
}
+ case 'p': {
+ switch (op[8]) {
+ case 'a':
+ if (strcmp(op, "f32x4.pmax") == 0) { return makeBinary(s, BinaryOp::PMaxVecF32x4); }
+ goto parse_error;
+ case 'i':
+ if (strcmp(op, "f32x4.pmin") == 0) { return makeBinary(s, BinaryOp::PMinVecF32x4); }
+ goto parse_error;
+ default: goto parse_error;
+ }
+ }
case 'q': {
switch (op[9]) {
case 'a':
@@ -619,6 +630,17 @@ switch (op[0]) {
default: goto parse_error;
}
}
+ case 'p': {
+ switch (op[8]) {
+ case 'a':
+ if (strcmp(op, "f64x2.pmax") == 0) { return makeBinary(s, BinaryOp::PMaxVecF64x2); }
+ goto parse_error;
+ case 'i':
+ if (strcmp(op, "f64x2.pmin") == 0) { return makeBinary(s, BinaryOp::PMinVecF64x2); }
+ goto parse_error;
+ default: goto parse_error;
+ }
+ }
case 'q': {
switch (op[9]) {
case 'a':
diff --git a/src/ir/cost.h b/src/ir/cost.h
index 2c503da02..8092d4ba2 100644
--- a/src/ir/cost.h
+++ b/src/ir/cost.h
@@ -687,6 +687,12 @@ struct CostAnalyzer : public Visitor<CostAnalyzer, Index> {
case MaxVecF32x4:
ret = 1;
break;
+ case PMinVecF32x4:
+ ret = 1;
+ break;
+ case PMaxVecF32x4:
+ ret = 1;
+ break;
case AddVecF64x2:
ret = 1;
break;
@@ -705,6 +711,12 @@ struct CostAnalyzer : public Visitor<CostAnalyzer, Index> {
case MaxVecF64x2:
ret = 1;
break;
+ case PMinVecF64x2:
+ ret = 1;
+ break;
+ case PMaxVecF64x2:
+ ret = 1;
+ break;
case NarrowSVecI16x8ToVecI8x16:
ret = 1;
break;
diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js
index 1706d2b97..993f8c129 100644
--- a/src/js/binaryen.js-post.js
+++ b/src/js/binaryen.js-post.js
@@ -421,6 +421,8 @@ function initializeConstants() {
'DivVecF32x4',
'MinVecF32x4',
'MaxVecF32x4',
+ 'PMinVecF32x4',
+ 'PMaxVecF32x4',
'AbsVecF64x2',
'NegVecF64x2',
'SqrtVecF64x2',
@@ -432,6 +434,8 @@ function initializeConstants() {
'DivVecF64x2',
'MinVecF64x2',
'MaxVecF64x2',
+ 'PMinVecF64x2',
+ 'PMaxVecF64x2',
'TruncSatSVecF32x4ToVecI32x4',
'TruncSatUVecF32x4ToVecI32x4',
'TruncSatSVecF64x2ToVecI64x2',
@@ -1904,6 +1908,12 @@ function wrapModule(module, self) {
'max': function(left, right) {
return Module['_BinaryenBinary'](module, Module['MaxVecF32x4'], left, right);
},
+ 'pmin': function(left, right) {
+ return Module['_BinaryenBinary'](module, Module['PMinVecF32x4'], left, right);
+ },
+ 'pmax': function(left, right) {
+ return Module['_BinaryenBinary'](module, Module['PMaxVecF32x4'], left, right);
+ },
'convert_i32x4_s': function(value) {
return Module['_BinaryenUnary'](module, Module['ConvertSVecI32x4ToVecF32x4'], value);
},
@@ -1973,6 +1983,12 @@ function wrapModule(module, self) {
'max': function(left, right) {
return Module['_BinaryenBinary'](module, Module['MaxVecF64x2'], left, right);
},
+ 'pmin': function(left, right) {
+ return Module['_BinaryenBinary'](module, Module['PMinVecF64x2'], left, right);
+ },
+ 'pmax': function(left, right) {
+ return Module['_BinaryenBinary'](module, Module['PMaxVecF64x2'], left, right);
+ },
'convert_i64x2_s': function(value) {
return Module['_BinaryenUnary'](module, Module['ConvertSVecI64x2ToVecF64x2'], value);
},
diff --git a/src/literal.h b/src/literal.h
index b21f08995..bba2b24d8 100644
--- a/src/literal.h
+++ b/src/literal.h
@@ -271,6 +271,8 @@ public:
Literal min(const Literal& other) const;
Literal max(const Literal& other) const;
+ Literal pmin(const Literal& other) const;
+ Literal pmax(const Literal& other) const;
Literal copysign(const Literal& other) const;
std::array<Literal, 16> getLanesSI8x16() const;
@@ -424,6 +426,8 @@ public:
Literal divF32x4(const Literal& other) const;
Literal minF32x4(const Literal& other) const;
Literal maxF32x4(const Literal& other) const;
+ Literal pminF32x4(const Literal& other) const;
+ Literal pmaxF32x4(const Literal& other) const;
Literal absF64x2() const;
Literal negF64x2() const;
Literal sqrtF64x2() const;
@@ -433,6 +437,8 @@ public:
Literal divF64x2(const Literal& other) const;
Literal minF64x2(const Literal& other) const;
Literal maxF64x2(const Literal& other) const;
+ Literal pminF64x2(const Literal& other) const;
+ Literal pmaxF64x2(const Literal& other) const;
Literal truncSatToSI32x4() const;
Literal truncSatToUI32x4() const;
Literal truncSatToSI64x2() const;
diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp
index 0839b3feb..3ed6edcb5 100644
--- a/src/passes/Print.cpp
+++ b/src/passes/Print.cpp
@@ -1337,6 +1337,12 @@ struct PrintExpressionContents
case MaxVecF32x4:
o << "f32x4.max";
break;
+ case PMinVecF32x4:
+ o << "f32x4.pmin";
+ break;
+ case PMaxVecF32x4:
+ o << "f32x4.pmax";
+ break;
case AddVecF64x2:
o << "f64x2.add";
break;
@@ -1355,6 +1361,12 @@ struct PrintExpressionContents
case MaxVecF64x2:
o << "f64x2.max";
break;
+ case PMinVecF64x2:
+ o << "f64x2.pmin";
+ break;
+ case PMaxVecF64x2:
+ o << "f64x2.pmax";
+ break;
case NarrowSVecI16x8ToVecI8x16:
o << "i8x16.narrow_i16x8_s";
diff --git a/src/wasm-binary.h b/src/wasm-binary.h
index 1ee9253d0..7a2e33864 100644
--- a/src/wasm-binary.h
+++ b/src/wasm-binary.h
@@ -859,6 +859,8 @@ enum ASTNodes {
F32x4Div = 0xe7,
F32x4Min = 0xe8,
F32x4Max = 0xe9,
+ F32x4PMin = 0xea,
+ F32x4PMax = 0xeb,
F64x2Abs = 0xec,
F64x2Neg = 0xed,
@@ -869,6 +871,8 @@ enum ASTNodes {
F64x2Div = 0xf3,
F64x2Min = 0xf4,
F64x2Max = 0xf5,
+ F64x2PMin = 0xf6,
+ F64x2PMax = 0xf7,
I32x4TruncSatSF32x4 = 0xf8,
I32x4TruncSatUF32x4 = 0xf9,
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h
index 2841dc432..257a0670f 100644
--- a/src/wasm-interpreter.h
+++ b/src/wasm-interpreter.h
@@ -893,6 +893,10 @@ public:
return left.minF32x4(right);
case MaxVecF32x4:
return left.maxF32x4(right);
+ case PMinVecF32x4:
+ return left.pminF32x4(right);
+ case PMaxVecF32x4:
+ return left.pmaxF32x4(right);
case AddVecF64x2:
return left.addF64x2(right);
case SubVecF64x2:
@@ -905,6 +909,10 @@ public:
return left.minF64x2(right);
case MaxVecF64x2:
return left.maxF64x2(right);
+ case PMinVecF64x2:
+ return left.pminF64x2(right);
+ case PMaxVecF64x2:
+ return left.pmaxF64x2(right);
case NarrowSVecI16x8ToVecI8x16:
return left.narrowSToVecI8x16(right);
diff --git a/src/wasm.h b/src/wasm.h
index b9b06a92c..81f9f4ba0 100644
--- a/src/wasm.h
+++ b/src/wasm.h
@@ -400,12 +400,16 @@ enum BinaryOp {
DivVecF32x4,
MinVecF32x4,
MaxVecF32x4,
+ PMinVecF32x4,
+ PMaxVecF32x4,
AddVecF64x2,
SubVecF64x2,
MulVecF64x2,
DivVecF64x2,
MinVecF64x2,
MaxVecF64x2,
+ PMinVecF64x2,
+ PMaxVecF64x2,
// SIMD Conversion
NarrowSVecI16x8ToVecI8x16,
diff --git a/src/wasm/literal.cpp b/src/wasm/literal.cpp
index 33e53ca48..5ad82acaf 100644
--- a/src/wasm/literal.cpp
+++ b/src/wasm/literal.cpp
@@ -1321,6 +1321,26 @@ Literal Literal::max(const Literal& other) const {
}
}
+Literal Literal::pmin(const Literal& other) const {
+ switch (type.getSingle()) {
+ case Type::f32:
+ case Type::f64:
+ return other.lt(*this).geti32() ? other : *this;
+ default:
+ WASM_UNREACHABLE("unexpected type");
+ }
+}
+
+Literal Literal::pmax(const Literal& other) const {
+ switch (type.getSingle()) {
+ case Type::f32:
+ case Type::f64:
+ return this->lt(other).geti32() ? other : *this;
+ default:
+ WASM_UNREACHABLE("unexpected type");
+ }
+}
+
Literal Literal::copysign(const Literal& other) const {
// operate on bits directly, to avoid signalling bit being set on a float
switch (type.getSingle()) {
@@ -1958,6 +1978,12 @@ Literal Literal::minF32x4(const Literal& other) const {
Literal Literal::maxF32x4(const Literal& other) const {
return binary<4, &Literal::getLanesF32x4, &Literal::max>(*this, other);
}
+Literal Literal::pminF32x4(const Literal& other) const {
+ return binary<4, &Literal::getLanesF32x4, &Literal::pmin>(*this, other);
+}
+Literal Literal::pmaxF32x4(const Literal& other) const {
+ return binary<4, &Literal::getLanesF32x4, &Literal::pmax>(*this, other);
+}
Literal Literal::addF64x2(const Literal& other) const {
return binary<2, &Literal::getLanesF64x2, &Literal::add>(*this, other);
}
@@ -1976,6 +2002,12 @@ Literal Literal::minF64x2(const Literal& other) const {
Literal Literal::maxF64x2(const Literal& other) const {
return binary<2, &Literal::getLanesF64x2, &Literal::max>(*this, other);
}
+Literal Literal::pminF64x2(const Literal& other) const {
+ return binary<2, &Literal::getLanesF64x2, &Literal::pmin>(*this, other);
+}
+Literal Literal::pmaxF64x2(const Literal& other) const {
+ return binary<2, &Literal::getLanesF64x2, &Literal::pmax>(*this, other);
+}
Literal Literal::dotSI16x8toI32x4(const Literal& other) const {
LaneArray<8> lhs = getLanesSI16x8();
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp
index b3314134d..3181288f8 100644
--- a/src/wasm/wasm-binary.cpp
+++ b/src/wasm/wasm-binary.cpp
@@ -4009,6 +4009,14 @@ bool WasmBinaryBuilder::maybeVisitSIMDBinary(Expression*& out, uint32_t code) {
curr = allocator.alloc<Binary>();
curr->op = MaxVecF32x4;
break;
+ case BinaryConsts::F32x4PMin:
+ curr = allocator.alloc<Binary>();
+ curr->op = PMinVecF32x4;
+ break;
+ case BinaryConsts::F32x4PMax:
+ curr = allocator.alloc<Binary>();
+ curr->op = PMaxVecF32x4;
+ break;
case BinaryConsts::F64x2Add:
curr = allocator.alloc<Binary>();
curr->op = AddVecF64x2;
@@ -4033,6 +4041,14 @@ bool WasmBinaryBuilder::maybeVisitSIMDBinary(Expression*& out, uint32_t code) {
curr = allocator.alloc<Binary>();
curr->op = MaxVecF64x2;
break;
+ case BinaryConsts::F64x2PMin:
+ curr = allocator.alloc<Binary>();
+ curr->op = PMinVecF64x2;
+ break;
+ case BinaryConsts::F64x2PMax:
+ curr = allocator.alloc<Binary>();
+ curr->op = PMaxVecF64x2;
+ break;
case BinaryConsts::I8x16NarrowSI16x8:
curr = allocator.alloc<Binary>();
curr->op = NarrowSVecI16x8ToVecI8x16;
diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp
index 48fe79fa1..a9415612d 100644
--- a/src/wasm/wasm-stack.cpp
+++ b/src/wasm/wasm-stack.cpp
@@ -1561,6 +1561,12 @@ void BinaryInstWriter::visitBinary(Binary* curr) {
case MaxVecF32x4:
o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F32x4Max);
break;
+ case PMinVecF32x4:
+ o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F32x4PMin);
+ break;
+ case PMaxVecF32x4:
+ o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F32x4PMax);
+ break;
case AddVecF64x2:
o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F64x2Add);
break;
@@ -1579,6 +1585,12 @@ void BinaryInstWriter::visitBinary(Binary* curr) {
case MaxVecF64x2:
o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F64x2Max);
break;
+ case PMinVecF64x2:
+ o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F64x2PMin);
+ break;
+ case PMaxVecF64x2:
+ o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F64x2PMax);
+ break;
case NarrowSVecI16x8ToVecI8x16:
o << int8_t(BinaryConsts::SIMDPrefix)
diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp
index 1aee9a15d..f5e134dba 100644
--- a/src/wasm/wasm-validator.cpp
+++ b/src/wasm/wasm-validator.cpp
@@ -1455,12 +1455,16 @@ void FunctionValidator::visitBinary(Binary* curr) {
case DivVecF32x4:
case MinVecF32x4:
case MaxVecF32x4:
+ case PMinVecF32x4:
+ case PMaxVecF32x4:
case AddVecF64x2:
case SubVecF64x2:
case MulVecF64x2:
case DivVecF64x2:
case MinVecF64x2:
case MaxVecF64x2:
+ case PMinVecF64x2:
+ case PMaxVecF64x2:
case NarrowSVecI16x8ToVecI8x16:
case NarrowUVecI16x8ToVecI8x16:
case NarrowSVecI32x4ToVecI16x8:
diff --git a/test/binaryen.js/kitchen-sink.js b/test/binaryen.js/kitchen-sink.js
index 6db6f3720..0b693b970 100644
--- a/test/binaryen.js/kitchen-sink.js
+++ b/test/binaryen.js/kitchen-sink.js
@@ -389,12 +389,16 @@ function test_core() {
module.f32x4.div(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
module.f32x4.min(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
module.f32x4.max(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
+ module.f32x4.pmin(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
+ module.f32x4.pmax(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
module.f64x2.add(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
module.f64x2.sub(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
module.f64x2.mul(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
module.f64x2.div(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
module.f64x2.min(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
module.f64x2.max(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
+ module.f64x2.pmin(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
+ module.f64x2.pmax(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
module.i8x16.narrow_i16x8_s(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
module.i8x16.narrow_i16x8_u(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
module.i16x8.narrow_i32x4_s(module.v128.const(v128_bytes), module.v128.const(v128_bytes)),
diff --git a/test/binaryen.js/kitchen-sink.js.txt b/test/binaryen.js/kitchen-sink.js.txt
index 976e72453..0e93201ff 100644
--- a/test/binaryen.js/kitchen-sink.js.txt
+++ b/test/binaryen.js/kitchen-sink.js.txt
@@ -1280,6 +1280,18 @@ getExpressionInfo(tuple[3])={"id":14,"type":5,"value":3.7}
)
)
(drop
+ (f32x4.pmin
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ )
+ )
+ (drop
+ (f32x4.pmax
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ )
+ )
+ (drop
(f64x2.add
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
@@ -1316,6 +1328,18 @@ getExpressionInfo(tuple[3])={"id":14,"type":5,"value":3.7}
)
)
(drop
+ (f64x2.pmin
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ )
+ )
+ (drop
+ (f64x2.pmax
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ )
+ )
+ (drop
(i8x16.narrow_i16x8_s
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
@@ -3048,6 +3072,18 @@ getExpressionInfo(tuple[3])={"id":14,"type":5,"value":3.7}
)
)
(drop
+ (f32x4.pmin
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ )
+ )
+ (drop
+ (f32x4.pmax
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ )
+ )
+ (drop
(f64x2.add
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
@@ -3084,6 +3120,18 @@ getExpressionInfo(tuple[3])={"id":14,"type":5,"value":3.7}
)
)
(drop
+ (f64x2.pmin
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ )
+ )
+ (drop
+ (f64x2.pmax
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ )
+ )
+ (drop
(i8x16.narrow_i16x8_s
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
diff --git a/test/example/c-api-kitchen-sink.c b/test/example/c-api-kitchen-sink.c
index 572e06ace..9b3b68cf7 100644
--- a/test/example/c-api-kitchen-sink.c
+++ b/test/example/c-api-kitchen-sink.c
@@ -561,12 +561,16 @@ void test_core() {
makeBinary(module, BinaryenDivVecF32x4(), v128),
makeBinary(module, BinaryenMinVecF32x4(), v128),
makeBinary(module, BinaryenMaxVecF32x4(), v128),
+ makeBinary(module, BinaryenPMinVecF32x4(), v128),
+ makeBinary(module, BinaryenPMaxVecF32x4(), v128),
makeBinary(module, BinaryenAddVecF64x2(), v128),
makeBinary(module, BinaryenSubVecF64x2(), v128),
makeBinary(module, BinaryenMulVecF64x2(), v128),
makeBinary(module, BinaryenDivVecF64x2(), v128),
makeBinary(module, BinaryenMinVecF64x2(), v128),
makeBinary(module, BinaryenMaxVecF64x2(), v128),
+ makeBinary(module, BinaryenPMinVecF64x2(), v128),
+ makeBinary(module, BinaryenPMaxVecF64x2(), v128),
makeBinary(module, BinaryenNarrowSVecI16x8ToVecI8x16(), v128),
makeBinary(module, BinaryenNarrowUVecI16x8ToVecI8x16(), v128),
makeBinary(module, BinaryenNarrowSVecI32x4ToVecI16x8(), v128),
diff --git a/test/example/c-api-kitchen-sink.txt b/test/example/c-api-kitchen-sink.txt
index 260f51066..d3e0281ee 100644
--- a/test/example/c-api-kitchen-sink.txt
+++ b/test/example/c-api-kitchen-sink.txt
@@ -1213,6 +1213,18 @@ BinaryenFeatureAll: 1023
)
)
(drop
+ (f32x4.pmin
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ )
+ )
+ (drop
+ (f32x4.pmax
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ )
+ )
+ (drop
(f64x2.add
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
@@ -1249,6 +1261,18 @@ BinaryenFeatureAll: 1023
)
)
(drop
+ (f64x2.pmin
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ )
+ )
+ (drop
+ (f64x2.pmax
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
+ )
+ )
+ (drop
(i8x16.narrow_i16x8_s
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
diff --git a/test/simd.wast b/test/simd.wast
index c1d63813d..fdb6d0309 100644
--- a/test/simd.wast
+++ b/test/simd.wast
@@ -826,6 +826,18 @@
(local.get $1)
)
)
+ (func $f32x4.pmin (param $0 v128) (param $1 v128) (result v128)
+ (f32x4.pmin
+ (local.get $0)
+ (local.get $1)
+ )
+ )
+ (func $f32x4.pmax (param $0 v128) (param $1 v128) (result v128)
+ (f32x4.pmax
+ (local.get $0)
+ (local.get $1)
+ )
+ )
(func $f32x4.abs (param $0 v128) (result v128)
(f32x4.abs
(local.get $0)
@@ -891,6 +903,18 @@
(local.get $1)
)
)
+ (func $f64x2.pmin (param $0 v128) (param $1 v128) (result v128)
+ (f64x2.pmin
+ (local.get $0)
+ (local.get $1)
+ )
+ )
+ (func $f64x2.pmax (param $0 v128) (param $1 v128) (result v128)
+ (f64x2.pmax
+ (local.get $0)
+ (local.get $1)
+ )
+ )
(func $f64x2.abs (param $0 v128) (result v128)
(f64x2.abs
(local.get $0)
diff --git a/test/simd.wast.from-wast b/test/simd.wast.from-wast
index da6240eac..17b9d7ffd 100644
--- a/test/simd.wast.from-wast
+++ b/test/simd.wast.from-wast
@@ -842,6 +842,18 @@
(local.get $1)
)
)
+ (func $f32x4.pmin (param $0 v128) (param $1 v128) (result v128)
+ (f32x4.pmin
+ (local.get $0)
+ (local.get $1)
+ )
+ )
+ (func $f32x4.pmax (param $0 v128) (param $1 v128) (result v128)
+ (f32x4.pmax
+ (local.get $0)
+ (local.get $1)
+ )
+ )
(func $f32x4.abs (param $0 v128) (result v128)
(f32x4.abs
(local.get $0)
@@ -907,6 +919,18 @@
(local.get $1)
)
)
+ (func $f64x2.pmin (param $0 v128) (param $1 v128) (result v128)
+ (f64x2.pmin
+ (local.get $0)
+ (local.get $1)
+ )
+ )
+ (func $f64x2.pmax (param $0 v128) (param $1 v128) (result v128)
+ (f64x2.pmax
+ (local.get $0)
+ (local.get $1)
+ )
+ )
(func $f64x2.abs (param $0 v128) (result v128)
(f64x2.abs
(local.get $0)
diff --git a/test/simd.wast.fromBinary b/test/simd.wast.fromBinary
index cb1707309..8ddfb9a6f 100644
--- a/test/simd.wast.fromBinary
+++ b/test/simd.wast.fromBinary
@@ -842,6 +842,18 @@
(local.get $1)
)
)
+ (func $f32x4.pmin (param $0 v128) (param $1 v128) (result v128)
+ (f32x4.pmin
+ (local.get $0)
+ (local.get $1)
+ )
+ )
+ (func $f32x4.pmax (param $0 v128) (param $1 v128) (result v128)
+ (f32x4.pmax
+ (local.get $0)
+ (local.get $1)
+ )
+ )
(func $f32x4.abs (param $0 v128) (result v128)
(f32x4.abs
(local.get $0)
@@ -907,6 +919,18 @@
(local.get $1)
)
)
+ (func $f64x2.pmin (param $0 v128) (param $1 v128) (result v128)
+ (f64x2.pmin
+ (local.get $0)
+ (local.get $1)
+ )
+ )
+ (func $f64x2.pmax (param $0 v128) (param $1 v128) (result v128)
+ (f64x2.pmax
+ (local.get $0)
+ (local.get $1)
+ )
+ )
(func $f64x2.abs (param $0 v128) (result v128)
(f64x2.abs
(local.get $0)
diff --git a/test/simd.wast.fromBinary.noDebugInfo b/test/simd.wast.fromBinary.noDebugInfo
index 83e5bca10..20617d09d 100644
--- a/test/simd.wast.fromBinary.noDebugInfo
+++ b/test/simd.wast.fromBinary.noDebugInfo
@@ -842,255 +842,279 @@
(local.get $1)
)
)
- (func $146 (param $0 v128) (result v128)
+ (func $146 (param $0 v128) (param $1 v128) (result v128)
+ (f32x4.pmin
+ (local.get $0)
+ (local.get $1)
+ )
+ )
+ (func $147 (param $0 v128) (param $1 v128) (result v128)
+ (f32x4.pmax
+ (local.get $0)
+ (local.get $1)
+ )
+ )
+ (func $148 (param $0 v128) (result v128)
(f32x4.abs
(local.get $0)
)
)
- (func $147 (param $0 v128) (result v128)
+ (func $149 (param $0 v128) (result v128)
(f32x4.neg
(local.get $0)
)
)
- (func $148 (param $0 v128) (result v128)
+ (func $150 (param $0 v128) (result v128)
(f32x4.sqrt
(local.get $0)
)
)
- (func $149 (param $0 v128) (param $1 v128) (param $2 v128) (result v128)
+ (func $151 (param $0 v128) (param $1 v128) (param $2 v128) (result v128)
(f32x4.qfma
(local.get $0)
(local.get $1)
(local.get $2)
)
)
- (func $150 (param $0 v128) (param $1 v128) (param $2 v128) (result v128)
+ (func $152 (param $0 v128) (param $1 v128) (param $2 v128) (result v128)
(f32x4.qfms
(local.get $0)
(local.get $1)
(local.get $2)
)
)
- (func $151 (param $0 v128) (param $1 v128) (result v128)
+ (func $153 (param $0 v128) (param $1 v128) (result v128)
(f64x2.add
(local.get $0)
(local.get $1)
)
)
- (func $152 (param $0 v128) (param $1 v128) (result v128)
+ (func $154 (param $0 v128) (param $1 v128) (result v128)
(f64x2.sub
(local.get $0)
(local.get $1)
)
)
- (func $153 (param $0 v128) (param $1 v128) (result v128)
+ (func $155 (param $0 v128) (param $1 v128) (result v128)
(f64x2.mul
(local.get $0)
(local.get $1)
)
)
- (func $154 (param $0 v128) (param $1 v128) (result v128)
+ (func $156 (param $0 v128) (param $1 v128) (result v128)
(f64x2.div
(local.get $0)
(local.get $1)
)
)
- (func $155 (param $0 v128) (param $1 v128) (result v128)
+ (func $157 (param $0 v128) (param $1 v128) (result v128)
(f64x2.min
(local.get $0)
(local.get $1)
)
)
- (func $156 (param $0 v128) (param $1 v128) (result v128)
+ (func $158 (param $0 v128) (param $1 v128) (result v128)
(f64x2.max
(local.get $0)
(local.get $1)
)
)
- (func $157 (param $0 v128) (result v128)
+ (func $159 (param $0 v128) (param $1 v128) (result v128)
+ (f64x2.pmin
+ (local.get $0)
+ (local.get $1)
+ )
+ )
+ (func $160 (param $0 v128) (param $1 v128) (result v128)
+ (f64x2.pmax
+ (local.get $0)
+ (local.get $1)
+ )
+ )
+ (func $161 (param $0 v128) (result v128)
(f64x2.abs
(local.get $0)
)
)
- (func $158 (param $0 v128) (result v128)
+ (func $162 (param $0 v128) (result v128)
(f64x2.neg
(local.get $0)
)
)
- (func $159 (param $0 v128) (result v128)
+ (func $163 (param $0 v128) (result v128)
(f64x2.sqrt
(local.get $0)
)
)
- (func $160 (param $0 v128) (param $1 v128) (param $2 v128) (result v128)
+ (func $164 (param $0 v128) (param $1 v128) (param $2 v128) (result v128)
(f64x2.qfma
(local.get $0)
(local.get $1)
(local.get $2)
)
)
- (func $161 (param $0 v128) (param $1 v128) (param $2 v128) (result v128)
+ (func $165 (param $0 v128) (param $1 v128) (param $2 v128) (result v128)
(f64x2.qfms
(local.get $0)
(local.get $1)
(local.get $2)
)
)
- (func $162 (param $0 v128) (result v128)
+ (func $166 (param $0 v128) (result v128)
(i32x4.trunc_sat_f32x4_s
(local.get $0)
)
)
- (func $163 (param $0 v128) (result v128)
+ (func $167 (param $0 v128) (result v128)
(i32x4.trunc_sat_f32x4_u
(local.get $0)
)
)
- (func $164 (param $0 v128) (result v128)
+ (func $168 (param $0 v128) (result v128)
(i64x2.trunc_sat_f64x2_s
(local.get $0)
)
)
- (func $165 (param $0 v128) (result v128)
+ (func $169 (param $0 v128) (result v128)
(i64x2.trunc_sat_f64x2_u
(local.get $0)
)
)
- (func $166 (param $0 v128) (result v128)
+ (func $170 (param $0 v128) (result v128)
(f32x4.convert_i32x4_s
(local.get $0)
)
)
- (func $167 (param $0 v128) (result v128)
+ (func $171 (param $0 v128) (result v128)
(f32x4.convert_i32x4_u
(local.get $0)
)
)
- (func $168 (param $0 v128) (result v128)
+ (func $172 (param $0 v128) (result v128)
(f64x2.convert_i64x2_s
(local.get $0)
)
)
- (func $169 (param $0 v128) (result v128)
+ (func $173 (param $0 v128) (result v128)
(f64x2.convert_i64x2_u
(local.get $0)
)
)
- (func $170 (param $0 i32) (result v128)
+ (func $174 (param $0 i32) (result v128)
(v8x16.load_splat
(local.get $0)
)
)
- (func $171 (param $0 i32) (result v128)
+ (func $175 (param $0 i32) (result v128)
(v16x8.load_splat
(local.get $0)
)
)
- (func $172 (param $0 i32) (result v128)
+ (func $176 (param $0 i32) (result v128)
(v32x4.load_splat
(local.get $0)
)
)
- (func $173 (param $0 i32) (result v128)
+ (func $177 (param $0 i32) (result v128)
(v64x2.load_splat
(local.get $0)
)
)
- (func $174 (param $0 v128) (param $1 v128) (result v128)
+ (func $178 (param $0 v128) (param $1 v128) (result v128)
(i8x16.narrow_i16x8_s
(local.get $0)
(local.get $1)
)
)
- (func $175 (param $0 v128) (param $1 v128) (result v128)
+ (func $179 (param $0 v128) (param $1 v128) (result v128)
(i8x16.narrow_i16x8_u
(local.get $0)
(local.get $1)
)
)
- (func $176 (param $0 v128) (param $1 v128) (result v128)
+ (func $180 (param $0 v128) (param $1 v128) (result v128)
(i16x8.narrow_i32x4_s
(local.get $0)
(local.get $1)
)
)
- (func $177 (param $0 v128) (param $1 v128) (result v128)
+ (func $181 (param $0 v128) (param $1 v128) (result v128)
(i16x8.narrow_i32x4_u
(local.get $0)
(local.get $1)
)
)
- (func $178 (param $0 v128) (result v128)
+ (func $182 (param $0 v128) (result v128)
(i16x8.widen_low_i8x16_s
(local.get $0)
)
)
- (func $179 (param $0 v128) (result v128)
+ (func $183 (param $0 v128) (result v128)
(i16x8.widen_high_i8x16_s
(local.get $0)
)
)
- (func $180 (param $0 v128) (result v128)
+ (func $184 (param $0 v128) (result v128)
(i16x8.widen_low_i8x16_u
(local.get $0)
)
)
- (func $181 (param $0 v128) (result v128)
+ (func $185 (param $0 v128) (result v128)
(i16x8.widen_high_i8x16_u
(local.get $0)
)
)
- (func $182 (param $0 v128) (result v128)
+ (func $186 (param $0 v128) (result v128)
(i32x4.widen_low_i16x8_s
(local.get $0)
)
)
- (func $183 (param $0 v128) (result v128)
+ (func $187 (param $0 v128) (result v128)
(i32x4.widen_high_i16x8_s
(local.get $0)
)
)
- (func $184 (param $0 v128) (result v128)
+ (func $188 (param $0 v128) (result v128)
(i32x4.widen_low_i16x8_u
(local.get $0)
)
)
- (func $185 (param $0 v128) (result v128)
+ (func $189 (param $0 v128) (result v128)
(i32x4.widen_high_i16x8_u
(local.get $0)
)
)
- (func $186 (param $0 i32) (result v128)
+ (func $190 (param $0 i32) (result v128)
(i16x8.load8x8_u
(local.get $0)
)
)
- (func $187 (param $0 i32) (result v128)
+ (func $191 (param $0 i32) (result v128)
(i16x8.load8x8_s
(local.get $0)
)
)
- (func $188 (param $0 i32) (result v128)
+ (func $192 (param $0 i32) (result v128)
(i32x4.load16x4_s
(local.get $0)
)
)
- (func $189 (param $0 i32) (result v128)
+ (func $193 (param $0 i32) (result v128)
(i32x4.load16x4_u
(local.get $0)
)
)
- (func $190 (param $0 i32) (result v128)
+ (func $194 (param $0 i32) (result v128)
(i64x2.load32x2_s
(local.get $0)
)
)
- (func $191 (param $0 i32) (result v128)
+ (func $195 (param $0 i32) (result v128)
(i64x2.load32x2_u
(local.get $0)
)
)
- (func $192 (param $0 v128) (param $1 v128) (result v128)
+ (func $196 (param $0 v128) (param $1 v128) (result v128)
(v8x16.swizzle
(local.get $0)
(local.get $1)
diff --git a/test/spec/simd.wast b/test/spec/simd.wast
index 90bf1a581..d6549f486 100644
--- a/test/spec/simd.wast
+++ b/test/spec/simd.wast
@@ -178,6 +178,8 @@
(func (export "f32x4.div") (param $0 v128) (param $1 v128) (result v128) (f32x4.div (local.get $0) (local.get $1)))
(func (export "f32x4.min") (param $0 v128) (param $1 v128) (result v128) (f32x4.min (local.get $0) (local.get $1)))
(func (export "f32x4.max") (param $0 v128) (param $1 v128) (result v128) (f32x4.max (local.get $0) (local.get $1)))
+ (func (export "f32x4.pmin") (param $0 v128) (param $1 v128) (result v128) (f32x4.pmin (local.get $0) (local.get $1)))
+ (func (export "f32x4.pmax") (param $0 v128) (param $1 v128) (result v128) (f32x4.pmax (local.get $0) (local.get $1)))
(func (export "f64x2.abs") (param $0 v128) (result v128) (f64x2.abs (local.get $0)))
(func (export "f64x2.neg") (param $0 v128) (result v128) (f64x2.neg (local.get $0)))
(func (export "f64x2.sqrt") (param $0 v128) (result v128) (f64x2.sqrt (local.get $0)))
@@ -189,6 +191,8 @@
(func (export "f64x2.div") (param $0 v128) (param $1 v128) (result v128) (f64x2.div (local.get $0) (local.get $1)))
(func (export "f64x2.min") (param $0 v128) (param $1 v128) (result v128) (f64x2.min (local.get $0) (local.get $1)))
(func (export "f64x2.max") (param $0 v128) (param $1 v128) (result v128) (f64x2.max (local.get $0) (local.get $1)))
+ (func (export "f64x2.pmin") (param $0 v128) (param $1 v128) (result v128) (f64x2.pmin (local.get $0) (local.get $1)))
+ (func (export "f64x2.pmax") (param $0 v128) (param $1 v128) (result v128) (f64x2.pmax (local.get $0) (local.get $1)))
(func (export "i32x4.trunc_sat_f32x4_s") (param $0 v128) (result v128) (i32x4.trunc_sat_f32x4_s (local.get $0)))
(func (export "i32x4.trunc_sat_f32x4_u") (param $0 v128) (result v128) (i32x4.trunc_sat_f32x4_u (local.get $0)))
(func (export "i64x2.trunc_sat_f64x2_s") (param $0 v128) (result v128) (i64x2.trunc_sat_f64x2_s (local.get $0)))
@@ -791,6 +795,8 @@
(assert_return (invoke "f32x4.div" (v128.const f32x4 nan -nan infinity 42) (v128.const f32x4 42 infinity 2 2)) (v128.const f32x4 nan -nan infinity 21))
(assert_return (invoke "f32x4.min" (v128.const f32x4 -0 0 nan 5) (v128.const f32x4 0 -0 5 nan)) (v128.const f32x4 -0 -0 nan nan))
(assert_return (invoke "f32x4.max" (v128.const f32x4 -0 0 nan 5) (v128.const f32x4 0 -0 5 nan)) (v128.const f32x4 0 0 nan nan))
+(assert_return (invoke "f32x4.pmin" (v128.const f32x4 -0 0 nan 5) (v128.const f32x4 0 -0 5 nan)) (v128.const f32x4 -0 0 nan 5))
+(assert_return (invoke "f32x4.pmax" (v128.const f32x4 -0 0 nan 5) (v128.const f32x4 0 -0 5 nan)) (v128.const f32x4 -0 0 nan 5))
;; f64x2 arithmetic
(assert_return (invoke "f64x2.abs" (v128.const f64x2 -0 nan)) (v128.const f64x2 0 nan))
@@ -812,6 +818,10 @@
(assert_return (invoke "f64x2.min" (v128.const f64x2 nan 5) (v128.const f64x2 5 nan)) (v128.const f64x2 nan nan))
(assert_return (invoke "f64x2.max" (v128.const f64x2 -0 0) (v128.const f64x2 0 -0)) (v128.const f64x2 0 0))
(assert_return (invoke "f64x2.max" (v128.const f64x2 nan 5) (v128.const f64x2 5 nan)) (v128.const f64x2 nan nan))
+(assert_return (invoke "f64x2.pmin" (v128.const f64x2 -0 0) (v128.const f64x2 0 -0)) (v128.const f64x2 -0 0))
+(assert_return (invoke "f64x2.pmin" (v128.const f64x2 nan 5) (v128.const f64x2 5 nan)) (v128.const f64x2 nan 5))
+(assert_return (invoke "f64x2.pmax" (v128.const f64x2 -0 0) (v128.const f64x2 0 -0)) (v128.const f64x2 -0 0))
+(assert_return (invoke "f64x2.pmax" (v128.const f64x2 nan 5) (v128.const f64x2 5 nan)) (v128.const f64x2 nan 5))
;; conversions
(assert_return (invoke "i32x4.trunc_sat_f32x4_s" (v128.const f32x4 42 nan infinity -infinity)) (v128.const i32x4 42 0 2147483647 -2147483648))