summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xscripts/gen-s-parser.py6
-rw-r--r--src/gen-s-parser.inc57
-rw-r--r--src/ir/child-typer.h6
-rw-r--r--src/ir/cost.h6
-rw-r--r--src/literal.h6
-rw-r--r--src/passes/Print.cpp18
-rw-r--r--src/tools/fuzzing/fuzzing.cpp7
-rw-r--r--src/wasm-binary.h6
-rw-r--r--src/wasm-interpreter.h12
-rw-r--r--src/wasm.h6
-rw-r--r--src/wasm/literal.cpp18
-rw-r--r--src/wasm/wasm-binary.cpp24
-rw-r--r--src/wasm/wasm-stack.cpp18
-rw-r--r--src/wasm/wasm-validator.cpp6
-rw-r--r--test/lit/basic/f16.wast216
-rw-r--r--test/spec/f16.wast56
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)
+)