diff options
-rwxr-xr-x | scripts/gen-s-parser.py | 6 | ||||
-rw-r--r-- | src/gen-s-parser.inc | 57 | ||||
-rw-r--r-- | src/ir/child-typer.h | 6 | ||||
-rw-r--r-- | src/ir/cost.h | 6 | ||||
-rw-r--r-- | src/literal.h | 6 | ||||
-rw-r--r-- | src/passes/Print.cpp | 18 | ||||
-rw-r--r-- | src/tools/fuzzing/fuzzing.cpp | 7 | ||||
-rw-r--r-- | src/wasm-binary.h | 6 | ||||
-rw-r--r-- | src/wasm-interpreter.h | 12 | ||||
-rw-r--r-- | src/wasm.h | 6 | ||||
-rw-r--r-- | src/wasm/literal.cpp | 18 | ||||
-rw-r--r-- | src/wasm/wasm-binary.cpp | 24 | ||||
-rw-r--r-- | src/wasm/wasm-stack.cpp | 18 | ||||
-rw-r--r-- | src/wasm/wasm-validator.cpp | 6 | ||||
-rw-r--r-- | test/lit/basic/f16.wast | 216 | ||||
-rw-r--r-- | test/spec/f16.wast | 56 |
16 files changed, 435 insertions, 33 deletions
diff --git a/scripts/gen-s-parser.py b/scripts/gen-s-parser.py index 9519ad4ee..3b2eb9d01 100755 --- a/scripts/gen-s-parser.py +++ b/scripts/gen-s-parser.py @@ -343,6 +343,12 @@ instructions = [ ("i64x2.gt_s", "makeBinary(BinaryOp::GtSVecI64x2)"), ("i64x2.le_s", "makeBinary(BinaryOp::LeSVecI64x2)"), ("i64x2.ge_s", "makeBinary(BinaryOp::GeSVecI64x2)"), + ("f16x8.eq", "makeBinary(BinaryOp::EqVecF16x8)"), + ("f16x8.ne", "makeBinary(BinaryOp::NeVecF16x8)"), + ("f16x8.lt", "makeBinary(BinaryOp::LtVecF16x8)"), + ("f16x8.gt", "makeBinary(BinaryOp::GtVecF16x8)"), + ("f16x8.le", "makeBinary(BinaryOp::LeVecF16x8)"), + ("f16x8.ge", "makeBinary(BinaryOp::GeVecF16x8)"), ("f32x4.eq", "makeBinary(BinaryOp::EqVecF32x4)"), ("f32x4.ne", "makeBinary(BinaryOp::NeVecF32x4)"), ("f32x4.lt", "makeBinary(BinaryOp::LtVecF32x4)"), diff --git a/src/gen-s-parser.inc b/src/gen-s-parser.inc index 33cddcb26..d6eaf851d 100644 --- a/src/gen-s-parser.inc +++ b/src/gen-s-parser.inc @@ -309,9 +309,60 @@ switch (buf[0]) { switch (buf[1]) { case '1': { switch (buf[6]) { - case 'e': - if (op == "f16x8.extract_lane"sv) { - CHECK_ERR(makeSIMDExtract(ctx, pos, annotations, SIMDExtractOp::ExtractLaneVecF16x8, 8)); + case 'e': { + switch (buf[7]) { + case 'q': + if (op == "f16x8.eq"sv) { + CHECK_ERR(makeBinary(ctx, pos, annotations, BinaryOp::EqVecF16x8)); + return Ok{}; + } + goto parse_error; + case 'x': + if (op == "f16x8.extract_lane"sv) { + CHECK_ERR(makeSIMDExtract(ctx, pos, annotations, SIMDExtractOp::ExtractLaneVecF16x8, 8)); + return Ok{}; + } + goto parse_error; + default: goto parse_error; + } + } + case 'g': { + switch (buf[7]) { + case 'e': + if (op == "f16x8.ge"sv) { + CHECK_ERR(makeBinary(ctx, pos, annotations, BinaryOp::GeVecF16x8)); + return Ok{}; + } + goto parse_error; + case 't': + if (op == "f16x8.gt"sv) { + CHECK_ERR(makeBinary(ctx, pos, annotations, BinaryOp::GtVecF16x8)); + return Ok{}; + } + goto parse_error; + default: goto parse_error; + } + } + case 'l': { + switch (buf[7]) { + case 'e': + if (op == "f16x8.le"sv) { + CHECK_ERR(makeBinary(ctx, pos, annotations, BinaryOp::LeVecF16x8)); + return Ok{}; + } + goto parse_error; + case 't': + if (op == "f16x8.lt"sv) { + CHECK_ERR(makeBinary(ctx, pos, annotations, BinaryOp::LtVecF16x8)); + return Ok{}; + } + goto parse_error; + default: goto parse_error; + } + } + case 'n': + if (op == "f16x8.ne"sv) { + CHECK_ERR(makeBinary(ctx, pos, annotations, BinaryOp::NeVecF16x8)); return Ok{}; } goto parse_error; diff --git a/src/ir/child-typer.h b/src/ir/child-typer.h index 17717a32c..2bfaefaff 100644 --- a/src/ir/child-typer.h +++ b/src/ir/child-typer.h @@ -558,6 +558,12 @@ template<typename Subtype> struct ChildTyper : OverriddenVisitor<Subtype> { case LeSVecI64x2: case GtSVecI64x2: case GeSVecI64x2: + case EqVecF16x8: + case NeVecF16x8: + case LtVecF16x8: + case LeVecF16x8: + case GtVecF16x8: + case GeVecF16x8: case EqVecF32x4: case NeVecF32x4: case LtVecF32x4: diff --git a/src/ir/cost.h b/src/ir/cost.h index 06512d656..ab8ae90ae 100644 --- a/src/ir/cost.h +++ b/src/ir/cost.h @@ -398,6 +398,12 @@ struct CostAnalyzer : public OverriddenVisitor<CostAnalyzer, CostType> { case LeSVecI64x2: case GtSVecI64x2: case GeSVecI64x2: + case EqVecF16x8: + case NeVecF16x8: + case LtVecF16x8: + case LeVecF16x8: + case GtVecF16x8: + case GeVecF16x8: case EqVecF32x4: case NeVecF32x4: case LtVecF32x4: diff --git a/src/literal.h b/src/literal.h index 63bbf6e74..d247b0c84 100644 --- a/src/literal.h +++ b/src/literal.h @@ -509,6 +509,12 @@ public: Literal gtSI64x2(const Literal& other) const; Literal leSI64x2(const Literal& other) const; Literal geSI64x2(const Literal& other) const; + Literal eqF16x8(const Literal& other) const; + Literal neF16x8(const Literal& other) const; + Literal ltF16x8(const Literal& other) const; + Literal gtF16x8(const Literal& other) const; + Literal leF16x8(const Literal& other) const; + Literal geF16x8(const Literal& other) const; Literal eqF32x4(const Literal& other) const; Literal neF32x4(const Literal& other) const; Literal ltF32x4(const Literal& other) const; diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp index fd22f1b71..5c83e89f1 100644 --- a/src/passes/Print.cpp +++ b/src/passes/Print.cpp @@ -1689,6 +1689,24 @@ struct PrintExpressionContents case GeSVecI64x2: o << "i64x2.ge_s"; break; + case EqVecF16x8: + o << "f16x8.eq"; + break; + case NeVecF16x8: + o << "f16x8.ne"; + break; + case LtVecF16x8: + o << "f16x8.lt"; + break; + case GtVecF16x8: + o << "f16x8.gt"; + break; + case LeVecF16x8: + o << "f16x8.le"; + break; + case GeVecF16x8: + o << "f16x8.ge"; + break; case EqVecF32x4: o << "f32x4.eq"; break; diff --git a/src/tools/fuzzing/fuzzing.cpp b/src/tools/fuzzing/fuzzing.cpp index fd0dfb26c..64780696b 100644 --- a/src/tools/fuzzing/fuzzing.cpp +++ b/src/tools/fuzzing/fuzzing.cpp @@ -3288,6 +3288,13 @@ Expression* TranslateToFuzzReader::makeBinary(Type type) { LeUVecI32x4, GeSVecI32x4, GeUVecI32x4, + EqVecF16x8, + EqVecF16x8, + NeVecF16x8, + LtVecF16x8, + GtVecF16x8, + LeVecF16x8, + GeVecF16x8, EqVecF32x4, NeVecF32x4, LtVecF32x4, diff --git a/src/wasm-binary.h b/src/wasm-binary.h index 38bf5d475..d568abd6c 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -1057,6 +1057,12 @@ enum ASTNodes { F16x8Splat = 0x120, F16x8ExtractLane = 0x121, F16x8ReplaceLane = 0x122, + F16x8Eq = 0x137, + F16x8Ne = 0x138, + F16x8Lt = 0x139, + F16x8Gt = 0x13a, + F16x8Le = 0x13b, + F16x8Ge = 0x13c, // bulk memory opcodes diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index f59a005b6..7fd5b3cd3 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -864,6 +864,18 @@ public: return left.leSI64x2(right); case GeSVecI64x2: return left.geSI64x2(right); + case EqVecF16x8: + return left.eqF16x8(right); + case NeVecF16x8: + return left.neF16x8(right); + case LtVecF16x8: + return left.ltF16x8(right); + case GtVecF16x8: + return left.gtF16x8(right); + case LeVecF16x8: + return left.leF16x8(right); + case GeVecF16x8: + return left.geF16x8(right); case EqVecF32x4: return left.eqF32x4(right); case NeVecF32x4: diff --git a/src/wasm.h b/src/wasm.h index 56e94fef7..e47b7c6ed 100644 --- a/src/wasm.h +++ b/src/wasm.h @@ -381,6 +381,12 @@ enum BinaryOp { GtSVecI64x2, LeSVecI64x2, GeSVecI64x2, + EqVecF16x8, + NeVecF16x8, + LtVecF16x8, + GtVecF16x8, + LeVecF16x8, + GeVecF16x8, EqVecF32x4, NeVecF32x4, LtVecF32x4, diff --git a/src/wasm/literal.cpp b/src/wasm/literal.cpp index a532b92d0..b0dcf5177 100644 --- a/src/wasm/literal.cpp +++ b/src/wasm/literal.cpp @@ -2209,6 +2209,24 @@ Literal Literal::geSI64x2(const Literal& other) const { return compare<2, &Literal::getLanesI64x2, &Literal::geS, int64_t>(*this, other); } +Literal Literal::eqF16x8(const Literal& other) const { + return compare<8, &Literal::getLanesF16x8, &Literal::eq>(*this, other); +} +Literal Literal::neF16x8(const Literal& other) const { + return compare<8, &Literal::getLanesF16x8, &Literal::ne>(*this, other); +} +Literal Literal::ltF16x8(const Literal& other) const { + return compare<8, &Literal::getLanesF16x8, &Literal::lt>(*this, other); +} +Literal Literal::gtF16x8(const Literal& other) const { + return compare<8, &Literal::getLanesF16x8, &Literal::gt>(*this, other); +} +Literal Literal::leF16x8(const Literal& other) const { + return compare<8, &Literal::getLanesF16x8, &Literal::le>(*this, other); +} +Literal Literal::geF16x8(const Literal& other) const { + return compare<8, &Literal::getLanesF16x8, &Literal::ge>(*this, other); +} Literal Literal::eqF32x4(const Literal& other) const { return compare<4, &Literal::getLanesF32x4, &Literal::eq>(*this, other); } diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 5eaa84515..d9985212f 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -5846,6 +5846,30 @@ bool WasmBinaryReader::maybeVisitSIMDBinary(Expression*& out, uint32_t code) { curr = allocator.alloc<Binary>(); curr->op = GeSVecI64x2; break; + case BinaryConsts::F16x8Eq: + curr = allocator.alloc<Binary>(); + curr->op = EqVecF16x8; + break; + case BinaryConsts::F16x8Ne: + curr = allocator.alloc<Binary>(); + curr->op = NeVecF16x8; + break; + case BinaryConsts::F16x8Lt: + curr = allocator.alloc<Binary>(); + curr->op = LtVecF16x8; + break; + case BinaryConsts::F16x8Gt: + curr = allocator.alloc<Binary>(); + curr->op = GtVecF16x8; + break; + case BinaryConsts::F16x8Le: + curr = allocator.alloc<Binary>(); + curr->op = LeVecF16x8; + break; + case BinaryConsts::F16x8Ge: + curr = allocator.alloc<Binary>(); + curr->op = GeVecF16x8; + break; case BinaryConsts::F32x4Eq: curr = allocator.alloc<Binary>(); curr->op = EqVecF32x4; diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp index 19b98769b..a9b582f43 100644 --- a/src/wasm/wasm-stack.cpp +++ b/src/wasm/wasm-stack.cpp @@ -1643,6 +1643,24 @@ void BinaryInstWriter::visitBinary(Binary* curr) { case GeSVecI64x2: o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::I64x2GeS); break; + case EqVecF16x8: + o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F16x8Eq); + break; + case NeVecF16x8: + o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F16x8Ne); + break; + case LtVecF16x8: + o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F16x8Lt); + break; + case GtVecF16x8: + o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F16x8Gt); + break; + case LeVecF16x8: + o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F16x8Le); + break; + case GeVecF16x8: + o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F16x8Ge); + break; case EqVecF32x4: o << int8_t(BinaryConsts::SIMDPrefix) << U32LEB(BinaryConsts::F32x4Eq); break; diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp index 6e59ce8d8..b35d1b3be 100644 --- a/src/wasm/wasm-validator.cpp +++ b/src/wasm/wasm-validator.cpp @@ -1743,6 +1743,12 @@ void FunctionValidator::visitBinary(Binary* curr) { case LeSVecI64x2: case GtSVecI64x2: case GeSVecI64x2: + case EqVecF16x8: + case NeVecF16x8: + case LtVecF16x8: + case LeVecF16x8: + case GtVecF16x8: + case GeVecF16x8: case EqVecF32x4: case NeVecF32x4: case LtVecF32x4: diff --git a/test/lit/basic/f16.wast b/test/lit/basic/f16.wast index 1dceb8075..21c9fc100 100644 --- a/test/lit/basic/f16.wast +++ b/test/lit/basic/f16.wast @@ -13,36 +13,40 @@ (memory 1 1) - ;; CHECK-TEXT: (type $0 (func (param i32) (result f32))) + ;; CHECK-TEXT: (type $0 (func (param v128 v128) (result v128))) - ;; CHECK-TEXT: (type $1 (func (param i32 f32))) + ;; CHECK-TEXT: (type $1 (func (param i32) (result f32))) - ;; CHECK-TEXT: (type $2 (func (param f32) (result v128))) + ;; CHECK-TEXT: (type $2 (func (param i32 f32))) - ;; CHECK-TEXT: (type $3 (func (param v128) (result f32))) + ;; CHECK-TEXT: (type $3 (func (param f32) (result v128))) - ;; CHECK-TEXT: (type $4 (func (param v128 f32) (result v128))) + ;; CHECK-TEXT: (type $4 (func (param v128) (result f32))) + + ;; CHECK-TEXT: (type $5 (func (param v128 f32) (result v128))) ;; CHECK-TEXT: (memory $0 1 1) - ;; CHECK-TEXT: (func $f32.load_f16 (type $0) (param $0 i32) (result f32) + ;; CHECK-TEXT: (func $f32.load_f16 (type $1) (param $0 i32) (result f32) ;; CHECK-TEXT-NEXT: (f32.load_f16 ;; CHECK-TEXT-NEXT: (local.get $0) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) - ;; CHECK-BIN: (type $0 (func (param i32) (result f32))) + ;; CHECK-BIN: (type $0 (func (param v128 v128) (result v128))) + + ;; CHECK-BIN: (type $1 (func (param i32) (result f32))) - ;; CHECK-BIN: (type $1 (func (param i32 f32))) + ;; CHECK-BIN: (type $2 (func (param i32 f32))) - ;; CHECK-BIN: (type $2 (func (param f32) (result v128))) + ;; CHECK-BIN: (type $3 (func (param f32) (result v128))) - ;; CHECK-BIN: (type $3 (func (param v128) (result f32))) + ;; CHECK-BIN: (type $4 (func (param v128) (result f32))) - ;; CHECK-BIN: (type $4 (func (param v128 f32) (result v128))) + ;; CHECK-BIN: (type $5 (func (param v128 f32) (result v128))) ;; CHECK-BIN: (memory $0 1 1) - ;; CHECK-BIN: (func $f32.load_f16 (type $0) (param $0 i32) (result f32) + ;; CHECK-BIN: (func $f32.load_f16 (type $1) (param $0 i32) (result f32) ;; CHECK-BIN-NEXT: (f32.load_f16 ;; CHECK-BIN-NEXT: (local.get $0) ;; CHECK-BIN-NEXT: ) @@ -52,13 +56,13 @@ (local.get $0) ) ) - ;; CHECK-TEXT: (func $f32.store_f16 (type $1) (param $0 i32) (param $1 f32) + ;; CHECK-TEXT: (func $f32.store_f16 (type $2) (param $0 i32) (param $1 f32) ;; CHECK-TEXT-NEXT: (f32.store_f16 ;; CHECK-TEXT-NEXT: (local.get $0) ;; CHECK-TEXT-NEXT: (local.get $1) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) - ;; CHECK-BIN: (func $f32.store_f16 (type $1) (param $0 i32) (param $1 f32) + ;; CHECK-BIN: (func $f32.store_f16 (type $2) (param $0 i32) (param $1 f32) ;; CHECK-BIN-NEXT: (f32.store_f16 ;; CHECK-BIN-NEXT: (local.get $0) ;; CHECK-BIN-NEXT: (local.get $1) @@ -71,12 +75,12 @@ ) ) - ;; CHECK-TEXT: (func $f16x8.splat (type $2) (param $0 f32) (result v128) + ;; CHECK-TEXT: (func $f16x8.splat (type $3) (param $0 f32) (result v128) ;; CHECK-TEXT-NEXT: (f16x8.splat ;; CHECK-TEXT-NEXT: (local.get $0) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) - ;; CHECK-BIN: (func $f16x8.splat (type $2) (param $0 f32) (result v128) + ;; CHECK-BIN: (func $f16x8.splat (type $3) (param $0 f32) (result v128) ;; CHECK-BIN-NEXT: (f16x8.splat ;; CHECK-BIN-NEXT: (local.get $0) ;; CHECK-BIN-NEXT: ) @@ -87,12 +91,12 @@ ) ) - ;; CHECK-TEXT: (func $f16x8.extract_lane (type $3) (param $0 v128) (result f32) + ;; CHECK-TEXT: (func $f16x8.extract_lane (type $4) (param $0 v128) (result f32) ;; CHECK-TEXT-NEXT: (f16x8.extract_lane 0 ;; CHECK-TEXT-NEXT: (local.get $0) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) - ;; CHECK-BIN: (func $f16x8.extract_lane (type $3) (param $0 v128) (result f32) + ;; CHECK-BIN: (func $f16x8.extract_lane (type $4) (param $0 v128) (result f32) ;; CHECK-BIN-NEXT: (f16x8.extract_lane 0 ;; CHECK-BIN-NEXT: (local.get $0) ;; CHECK-BIN-NEXT: ) @@ -103,13 +107,13 @@ ) ) - ;; CHECK-TEXT: (func $f16x8.replace_lane (type $4) (param $0 v128) (param $1 f32) (result v128) + ;; CHECK-TEXT: (func $f16x8.replace_lane (type $5) (param $0 v128) (param $1 f32) (result v128) ;; CHECK-TEXT-NEXT: (f16x8.replace_lane 0 ;; CHECK-TEXT-NEXT: (local.get $0) ;; CHECK-TEXT-NEXT: (local.get $1) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) - ;; CHECK-BIN: (func $f16x8.replace_lane (type $4) (param $0 v128) (param $1 f32) (result v128) + ;; CHECK-BIN: (func $f16x8.replace_lane (type $5) (param $0 v128) (param $1 f32) (result v128) ;; CHECK-BIN-NEXT: (f16x8.replace_lane 0 ;; CHECK-BIN-NEXT: (local.get $0) ;; CHECK-BIN-NEXT: (local.get $1) @@ -121,48 +125,200 @@ (local.get $1) ) ) + ;; CHECK-TEXT: (func $f16x8.eq (type $0) (param $0 v128) (param $1 v128) (result v128) + ;; CHECK-TEXT-NEXT: (f16x8.eq + ;; CHECK-TEXT-NEXT: (local.get $0) + ;; CHECK-TEXT-NEXT: (local.get $1) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-BIN: (func $f16x8.eq (type $0) (param $0 v128) (param $1 v128) (result v128) + ;; CHECK-BIN-NEXT: (f16x8.eq + ;; CHECK-BIN-NEXT: (local.get $0) + ;; CHECK-BIN-NEXT: (local.get $1) + ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: ) + (func $f16x8.eq (param $0 v128) (param $1 v128) (result v128) + (f16x8.eq + (local.get $0) + (local.get $1) + ) + ) + ;; CHECK-TEXT: (func $f16x8.ne (type $0) (param $0 v128) (param $1 v128) (result v128) + ;; CHECK-TEXT-NEXT: (f16x8.ne + ;; CHECK-TEXT-NEXT: (local.get $0) + ;; CHECK-TEXT-NEXT: (local.get $1) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-BIN: (func $f16x8.ne (type $0) (param $0 v128) (param $1 v128) (result v128) + ;; CHECK-BIN-NEXT: (f16x8.ne + ;; CHECK-BIN-NEXT: (local.get $0) + ;; CHECK-BIN-NEXT: (local.get $1) + ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: ) + (func $f16x8.ne (param $0 v128) (param $1 v128) (result v128) + (f16x8.ne + (local.get $0) + (local.get $1) + ) + ) + ;; CHECK-TEXT: (func $f16x8.lt (type $0) (param $0 v128) (param $1 v128) (result v128) + ;; CHECK-TEXT-NEXT: (f16x8.lt + ;; CHECK-TEXT-NEXT: (local.get $0) + ;; CHECK-TEXT-NEXT: (local.get $1) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-BIN: (func $f16x8.lt (type $0) (param $0 v128) (param $1 v128) (result v128) + ;; CHECK-BIN-NEXT: (f16x8.lt + ;; CHECK-BIN-NEXT: (local.get $0) + ;; CHECK-BIN-NEXT: (local.get $1) + ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: ) + (func $f16x8.lt (param $0 v128) (param $1 v128) (result v128) + (f16x8.lt + (local.get $0) + (local.get $1) + ) + ) + ;; CHECK-TEXT: (func $f16x8.gt (type $0) (param $0 v128) (param $1 v128) (result v128) + ;; CHECK-TEXT-NEXT: (f16x8.gt + ;; CHECK-TEXT-NEXT: (local.get $0) + ;; CHECK-TEXT-NEXT: (local.get $1) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-BIN: (func $f16x8.gt (type $0) (param $0 v128) (param $1 v128) (result v128) + ;; CHECK-BIN-NEXT: (f16x8.gt + ;; CHECK-BIN-NEXT: (local.get $0) + ;; CHECK-BIN-NEXT: (local.get $1) + ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: ) + (func $f16x8.gt (param $0 v128) (param $1 v128) (result v128) + (f16x8.gt + (local.get $0) + (local.get $1) + ) + ) + ;; CHECK-TEXT: (func $f16x8.le (type $0) (param $0 v128) (param $1 v128) (result v128) + ;; CHECK-TEXT-NEXT: (f16x8.le + ;; CHECK-TEXT-NEXT: (local.get $0) + ;; CHECK-TEXT-NEXT: (local.get $1) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-BIN: (func $f16x8.le (type $0) (param $0 v128) (param $1 v128) (result v128) + ;; CHECK-BIN-NEXT: (f16x8.le + ;; CHECK-BIN-NEXT: (local.get $0) + ;; CHECK-BIN-NEXT: (local.get $1) + ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: ) + (func $f16x8.le (param $0 v128) (param $1 v128) (result v128) + (f16x8.le + (local.get $0) + (local.get $1) + ) + ) + ;; CHECK-TEXT: (func $f16x8.ge (type $0) (param $0 v128) (param $1 v128) (result v128) + ;; CHECK-TEXT-NEXT: (f16x8.ge + ;; CHECK-TEXT-NEXT: (local.get $0) + ;; CHECK-TEXT-NEXT: (local.get $1) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-BIN: (func $f16x8.ge (type $0) (param $0 v128) (param $1 v128) (result v128) + ;; CHECK-BIN-NEXT: (f16x8.ge + ;; CHECK-BIN-NEXT: (local.get $0) + ;; CHECK-BIN-NEXT: (local.get $1) + ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: ) + (func $f16x8.ge (param $0 v128) (param $1 v128) (result v128) + (f16x8.ge + (local.get $0) + (local.get $1) + ) + ) ) -;; CHECK-BIN-NODEBUG: (type $0 (func (param i32) (result f32))) +;; CHECK-BIN-NODEBUG: (type $0 (func (param v128 v128) (result v128))) + +;; CHECK-BIN-NODEBUG: (type $1 (func (param i32) (result f32))) -;; CHECK-BIN-NODEBUG: (type $1 (func (param i32 f32))) +;; CHECK-BIN-NODEBUG: (type $2 (func (param i32 f32))) -;; CHECK-BIN-NODEBUG: (type $2 (func (param f32) (result v128))) +;; CHECK-BIN-NODEBUG: (type $3 (func (param f32) (result v128))) -;; CHECK-BIN-NODEBUG: (type $3 (func (param v128) (result f32))) +;; CHECK-BIN-NODEBUG: (type $4 (func (param v128) (result f32))) -;; CHECK-BIN-NODEBUG: (type $4 (func (param v128 f32) (result v128))) +;; CHECK-BIN-NODEBUG: (type $5 (func (param v128 f32) (result v128))) ;; CHECK-BIN-NODEBUG: (memory $0 1 1) -;; CHECK-BIN-NODEBUG: (func $0 (type $0) (param $0 i32) (result f32) +;; CHECK-BIN-NODEBUG: (func $0 (type $1) (param $0 i32) (result f32) ;; CHECK-BIN-NODEBUG-NEXT: (f32.load_f16 ;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) -;; CHECK-BIN-NODEBUG: (func $1 (type $1) (param $0 i32) (param $1 f32) +;; CHECK-BIN-NODEBUG: (func $1 (type $2) (param $0 i32) (param $1 f32) ;; CHECK-BIN-NODEBUG-NEXT: (f32.store_f16 ;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) ;; CHECK-BIN-NODEBUG-NEXT: (local.get $1) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) -;; CHECK-BIN-NODEBUG: (func $2 (type $2) (param $0 f32) (result v128) +;; CHECK-BIN-NODEBUG: (func $2 (type $3) (param $0 f32) (result v128) ;; CHECK-BIN-NODEBUG-NEXT: (f16x8.splat ;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) -;; CHECK-BIN-NODEBUG: (func $3 (type $3) (param $0 v128) (result f32) +;; CHECK-BIN-NODEBUG: (func $3 (type $4) (param $0 v128) (result f32) ;; CHECK-BIN-NODEBUG-NEXT: (f16x8.extract_lane 0 ;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) -;; CHECK-BIN-NODEBUG: (func $4 (type $4) (param $0 v128) (param $1 f32) (result v128) +;; CHECK-BIN-NODEBUG: (func $4 (type $5) (param $0 v128) (param $1 f32) (result v128) ;; CHECK-BIN-NODEBUG-NEXT: (f16x8.replace_lane 0 ;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) ;; CHECK-BIN-NODEBUG-NEXT: (local.get $1) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) + +;; CHECK-BIN-NODEBUG: (func $5 (type $0) (param $0 v128) (param $1 v128) (result v128) +;; CHECK-BIN-NODEBUG-NEXT: (f16x8.eq +;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) +;; CHECK-BIN-NODEBUG-NEXT: (local.get $1) +;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: ) + +;; CHECK-BIN-NODEBUG: (func $6 (type $0) (param $0 v128) (param $1 v128) (result v128) +;; CHECK-BIN-NODEBUG-NEXT: (f16x8.ne +;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) +;; CHECK-BIN-NODEBUG-NEXT: (local.get $1) +;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: ) + +;; CHECK-BIN-NODEBUG: (func $7 (type $0) (param $0 v128) (param $1 v128) (result v128) +;; CHECK-BIN-NODEBUG-NEXT: (f16x8.lt +;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) +;; CHECK-BIN-NODEBUG-NEXT: (local.get $1) +;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: ) + +;; CHECK-BIN-NODEBUG: (func $8 (type $0) (param $0 v128) (param $1 v128) (result v128) +;; CHECK-BIN-NODEBUG-NEXT: (f16x8.gt +;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) +;; CHECK-BIN-NODEBUG-NEXT: (local.get $1) +;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: ) + +;; CHECK-BIN-NODEBUG: (func $9 (type $0) (param $0 v128) (param $1 v128) (result v128) +;; CHECK-BIN-NODEBUG-NEXT: (f16x8.le +;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) +;; CHECK-BIN-NODEBUG-NEXT: (local.get $1) +;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: ) + +;; CHECK-BIN-NODEBUG: (func $10 (type $0) (param $0 v128) (param $1 v128) (result v128) +;; CHECK-BIN-NODEBUG-NEXT: (f16x8.ge +;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) +;; CHECK-BIN-NODEBUG-NEXT: (local.get $1) +;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: ) diff --git a/test/spec/f16.wast b/test/spec/f16.wast index ef32b2ab5..360464e15 100644 --- a/test/spec/f16.wast +++ b/test/spec/f16.wast @@ -11,6 +11,12 @@ (func (export "f16x8.extract_lane_last") (param $0 v128) (result f32) (f16x8.extract_lane 7 (local.get $0))) (func (export "f16x8.replace_lane_first") (param $0 v128) (param $1 f32) (result v128) (f16x8.replace_lane 0 (local.get $0) (local.get $1))) (func (export "f16x8.replace_lane_last") (param $0 v128) (param $1 f32) (result v128) (f16x8.replace_lane 7 (local.get $0) (local.get $1))) + (func (export "f16x8.eq") (param $0 v128) (param $1 v128) (result v128) (f16x8.eq (local.get $0) (local.get $1))) + (func (export "f16x8.ne") (param $0 v128) (param $1 v128) (result v128) (f16x8.ne (local.get $0) (local.get $1))) + (func (export "f16x8.lt") (param $0 v128) (param $1 v128) (result v128) (f16x8.lt (local.get $0) (local.get $1))) + (func (export "f16x8.gt") (param $0 v128) (param $1 v128) (result v128) (f16x8.gt (local.get $0) (local.get $1))) + (func (export "f16x8.le") (param $0 v128) (param $1 v128) (result v128) (f16x8.le (local.get $0) (local.get $1))) + (func (export "f16x8.ge") (param $0 v128) (param $1 v128) (result v128) (f16x8.ge (local.get $0) (local.get $1))) ) (assert_return (invoke "f32.load_f16") (f32.const 42.0)) @@ -25,3 +31,53 @@ (assert_return (invoke "f16x8.extract_lane_last" (v128.const i16x8 0 0 0 0 0 0 0 0xc500)) (f32.const -5)) (assert_return (invoke "f16x8.replace_lane_first" (v128.const i64x2 0 0) (f32.const 100.5)) (v128.const i16x8 0x5648 0 0 0 0 0 0 0)) (assert_return (invoke "f16x8.replace_lane_last" (v128.const i64x2 0 0) (f32.const 100.5)) (v128.const i16x8 0 0 0 0 0 0 0 0x5648)) + +;; comparisons +(assert_return (invoke "f16x8.eq" + ;; 0 -1 1 nan inf nan inf nan + ;; 0 0 -1 nan inf 0 -inf inf + (v128.const i16x8 0 0xbc00 0x3c00 0x7e00 0x7c00 0x7e00 0x7c00 0x7e00) + (v128.const i16x8 0 0 0xbc00 0x7e00 0x7c00 0 0xfc00 0x7c00) + ) + (v128.const i16x8 -1 0 0 0 -1 0 0 0) +) +(assert_return (invoke "f16x8.ne" + ;; 0 -1 1 nan inf nan inf nan + ;; 0 0 -1 nan inf 0 -inf inf + (v128.const i16x8 0 0xbc00 0x3c00 0x7e00 0x7c00 0x7e00 0x7c00 0x7e00) + (v128.const i16x8 0 0 0xbc00 0x7e00 0x7c00 0 0xfc00 0x7c00) + ) + (v128.const i16x8 0 -1 -1 -1 0 -1 -1 -1) +) +(assert_return (invoke "f16x8.lt" + ;; 0 -1 1 nan inf nan inf nan + ;; 0 0 -1 nan inf 0 -inf inf + (v128.const i16x8 0 0xbc00 0x3c00 0x7e00 0x7c00 0x7e00 0x7c00 0x7e00) + (v128.const i16x8 0 0 0xbc00 0x7e00 0x7c00 0 0xfc00 0x7c00) + ) + (v128.const i16x8 0 -1 0 0 0 0 0 0) +) +(assert_return (invoke "f16x8.gt" + ;; 0 -1 1 nan inf nan inf nan + ;; 0 0 -1 nan inf 0 -inf inf + (v128.const i16x8 0 0xbc00 0x3c00 0x7e00 0x7c00 0x7e00 0x7c00 0x7e00) + (v128.const i16x8 0 0 0xbc00 0x7e00 0x7c00 0 0xfc00 0x7c00) + ) + (v128.const i16x8 0 0 -1 0 0 0 -1 0) +) +(assert_return (invoke "f16x8.le" + ;; 0 -1 1 nan inf nan inf nan + ;; 0 0 -1 nan inf 0 -inf inf + (v128.const i16x8 0 0xbc00 0x3c00 0x7e00 0x7c00 0x7e00 0x7c00 0x7e00) + (v128.const i16x8 0 0 0xbc00 0x7e00 0x7c00 0 0xfc00 0x7c00) + ) + (v128.const i16x8 -1 -1 0 0 -1 0 0 0) +) +(assert_return (invoke "f16x8.ge" + ;; 0 -1 1 nan inf nan inf nan + ;; 0 0 -1 nan inf 0 -inf inf + (v128.const i16x8 0 0xbc00 0x3c00 0x7e00 0x7c00 0x7e00 0x7c00 0x7e00) + (v128.const i16x8 0 0 0xbc00 0x7e00 0x7c00 0 0xfc00 0x7c00) + ) + (v128.const i16x8 -1 0 -1 0 -1 0 -1 0) +) |