Skip to content

Commit b304792

Browse files
committed
1 parent 27dbce1 commit b304792

File tree

16 files changed

+185
-5
lines changed

16 files changed

+185
-5
lines changed

scripts/gen-s-parser.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,8 @@
550550
("f16x8.convert_i16x8_s", "makeUnary(UnaryOp::ConvertSVecI16x8ToVecF16x8)"),
551551
("f16x8.convert_i16x8_u", "makeUnary(UnaryOp::ConvertUVecI16x8ToVecF16x8)"),
552552
("f32x4.promote_low_f16x8", "makeUnary(UnaryOp::PromoteLowVecF16x8ToVecF32x4)"),
553+
("f16x8.demote_f32x4_zero", "makeUnary(UnaryOp::DemoteZeroVecF32x4ToVecF16x8)"),
554+
("f16x8.demote_f64x2_zero", "makeUnary(UnaryOp::DemoteZeroVecF64x2ToVecF16x8)"),
553555
("f16x8.madd", "makeSIMDTernary(SIMDTernaryOp::MaddVecF16x8)"),
554556
("f16x8.nmadd", "makeSIMDTernary(SIMDTernaryOp::NmaddVecF16x8)"),
555557

src/gen-s-parser.inc

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -505,12 +505,34 @@ switch (buf[0]) {
505505
default: goto parse_error;
506506
}
507507
}
508-
case 'd':
509-
if (op == "f16x8.div"sv) {
510-
CHECK_ERR(makeBinary(ctx, pos, annotations, BinaryOp::DivVecF16x8));
511-
return Ok{};
508+
case 'd': {
509+
switch (buf[7]) {
510+
case 'e': {
511+
switch (buf[14]) {
512+
case '3':
513+
if (op == "f16x8.demote_f32x4_zero"sv) {
514+
CHECK_ERR(makeUnary(ctx, pos, annotations, UnaryOp::DemoteZeroVecF32x4ToVecF16x8));
515+
return Ok{};
516+
}
517+
goto parse_error;
518+
case '6':
519+
if (op == "f16x8.demote_f64x2_zero"sv) {
520+
CHECK_ERR(makeUnary(ctx, pos, annotations, UnaryOp::DemoteZeroVecF64x2ToVecF16x8));
521+
return Ok{};
522+
}
523+
goto parse_error;
524+
default: goto parse_error;
525+
}
526+
}
527+
case 'i':
528+
if (op == "f16x8.div"sv) {
529+
CHECK_ERR(makeBinary(ctx, pos, annotations, BinaryOp::DivVecF16x8));
530+
return Ok{};
531+
}
532+
goto parse_error;
533+
default: goto parse_error;
512534
}
513-
goto parse_error;
535+
}
514536
case 'e': {
515537
switch (buf[7]) {
516538
case 'q':

src/ir/child-typer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,8 @@ template<typename Subtype> struct ChildTyper : OverriddenVisitor<Subtype> {
448448
case ConvertSVecI16x8ToVecF16x8:
449449
case ConvertUVecI16x8ToVecF16x8:
450450
case PromoteLowVecF16x8ToVecF32x4:
451+
case DemoteZeroVecF32x4ToVecF16x8:
452+
case DemoteZeroVecF64x2ToVecF16x8:
451453
case AnyTrueVec128:
452454
case AllTrueVecI8x16:
453455
case AllTrueVecI16x8:

src/ir/cost.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,8 @@ struct CostAnalyzer : public OverriddenVisitor<CostAnalyzer, CostType> {
285285
case ConvertSVecI16x8ToVecF16x8:
286286
case ConvertUVecI16x8ToVecF16x8:
287287
case PromoteLowVecF16x8ToVecF32x4:
288+
case DemoteZeroVecF32x4ToVecF16x8:
289+
case DemoteZeroVecF64x2ToVecF16x8:
288290
ret = 1;
289291
break;
290292
case InvalidUnary:

src/literal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -724,6 +724,8 @@ class Literal {
724724
Literal demoteZeroToF32x4() const;
725725
Literal promoteLowToF64x2() const;
726726
Literal promoteLowF16x8ToF32x4() const;
727+
Literal demoteZeroF32x4ToF16x8() const;
728+
Literal demoteZeroF64x2ToF16x8() const;
727729
Literal truncSatToSI16x8() const;
728730
Literal truncSatToUI16x8() const;
729731
Literal convertSToF16x8() const;

src/passes/Print.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1404,6 +1404,12 @@ struct PrintExpressionContents
14041404
case PromoteLowVecF16x8ToVecF32x4:
14051405
o << "f32x4.promote_low_f16x8";
14061406
break;
1407+
case DemoteZeroVecF32x4ToVecF16x8:
1408+
o << "f16x8.demote_f32x4_zero";
1409+
break;
1410+
case DemoteZeroVecF64x2ToVecF16x8:
1411+
o << "f16x8.demote_f64x2_zero";
1412+
break;
14071413
case InvalidUnary:
14081414
WASM_UNREACHABLE("unvalid unary operator");
14091415
}

src/wasm-binary.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1126,6 +1126,8 @@ enum ASTNodes {
11261126
I16x8TruncSatF16x8U = 0x146,
11271127
F16x8ConvertI16x8S = 0x147,
11281128
F16x8ConvertI16x8U = 0x148,
1129+
F16x8DemoteF32x4Zero = 0x149,
1130+
F16x8DemoteF64x2Zero = 0x14a,
11291131
F32x4PromoteLowF16x8 = 0x14b,
11301132

11311133
// bulk memory opcodes

src/wasm-interpreter.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1166,6 +1166,10 @@ class ExpressionRunner : public OverriddenVisitor<SubType, Flow> {
11661166
return value.convertUToF16x8();
11671167
case PromoteLowVecF16x8ToVecF32x4:
11681168
return value.promoteLowF16x8ToF32x4();
1169+
case DemoteZeroVecF32x4ToVecF16x8:
1170+
return value.demoteZeroF32x4ToF16x8();
1171+
case DemoteZeroVecF64x2ToVecF16x8:
1172+
return value.demoteZeroF64x2ToF16x8();
11691173
case InvalidUnary:
11701174
WASM_UNREACHABLE("invalid unary op");
11711175
}

src/wasm.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,8 @@ enum UnaryOp {
252252
ConvertSVecI16x8ToVecF16x8,
253253
ConvertUVecI16x8ToVecF16x8,
254254
PromoteLowVecF16x8ToVecF32x4,
255+
DemoteZeroVecF32x4ToVecF16x8,
256+
DemoteZeroVecF64x2ToVecF16x8,
255257

256258
InvalidUnary
257259
};

src/wasm/literal.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2912,6 +2912,30 @@ Literal Literal::truncSatZeroUToI32x4() const {
29122912
Literal Literal::demoteZeroToF32x4() const {
29132913
return unary_zero<4, &Literal::getLanesF64x2, &Literal::demote>(*this);
29142914
}
2915+
Literal Literal::demoteZeroF32x4ToF16x8() const {
2916+
auto lanes = getLanesF32x4();
2917+
LaneArray<8> result;
2918+
for (size_t i = 0; i < 4; ++i) {
2919+
result[i] = Literal(fp16_ieee_from_fp32_value(lanes[i].getf32()));
2920+
}
2921+
for (size_t i = 4; i < 8; ++i) {
2922+
result[i] = Literal(int32_t(0));
2923+
}
2924+
return Literal(result);
2925+
}
2926+
2927+
Literal Literal::demoteZeroF64x2ToF16x8() const {
2928+
auto lanes = getLanesF64x2();
2929+
LaneArray<8> result;
2930+
for (size_t i = 0; i < 2; ++i) {
2931+
result[i] = Literal(fp16_ieee_from_fp32_value(lanes[i].demote().getf32()));
2932+
}
2933+
for (size_t i = 2; i < 8; ++i) {
2934+
result[i] = Literal(int32_t(0));
2935+
}
2936+
return Literal(result);
2937+
}
2938+
29152939
Literal Literal::promoteLowToF64x2() const {
29162940
return extendF32<LaneOrder::Low>(*this);
29172941
}

0 commit comments

Comments
 (0)