diff options
-rwxr-xr-x | scripts/gen-s-parser.py | 4 | ||||
-rw-r--r-- | src/binaryen-c.cpp | 4 | ||||
-rw-r--r-- | src/binaryen-c.h | 4 | ||||
-rw-r--r-- | src/gen-s-parser.inc | 22 | ||||
-rw-r--r-- | src/ir/cost.h | 12 | ||||
-rw-r--r-- | src/js/binaryen.js-post.js | 16 | ||||
-rw-r--r-- | src/literal.h | 6 | ||||
-rw-r--r-- | src/passes/Print.cpp | 12 | ||||
-rw-r--r-- | src/wasm-binary.h | 4 | ||||
-rw-r--r-- | src/wasm-interpreter.h | 8 | ||||
-rw-r--r-- | src/wasm.h | 4 | ||||
-rw-r--r-- | src/wasm/literal.cpp | 32 | ||||
-rw-r--r-- | src/wasm/wasm-binary.cpp | 16 | ||||
-rw-r--r-- | src/wasm/wasm-stack.cpp | 12 | ||||
-rw-r--r-- | src/wasm/wasm-validator.cpp | 4 | ||||
-rw-r--r-- | test/binaryen.js/kitchen-sink.js | 4 | ||||
-rw-r--r-- | test/binaryen.js/kitchen-sink.js.txt | 48 | ||||
-rw-r--r-- | test/example/c-api-kitchen-sink.c | 4 | ||||
-rw-r--r-- | test/example/c-api-kitchen-sink.txt | 24 | ||||
-rw-r--r-- | test/simd.wast | 24 | ||||
-rw-r--r-- | test/simd.wast.from-wast | 24 | ||||
-rw-r--r-- | test/simd.wast.fromBinary | 24 | ||||
-rw-r--r-- | test/simd.wast.fromBinary.noDebugInfo | 118 | ||||
-rw-r--r-- | test/spec/simd.wast | 10 |
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)) |