Skip to content

Commit 0b8b9c2

Browse files
Mul support
1 parent c6a5e65 commit 0b8b9c2

34 files changed

Lines changed: 382 additions & 316 deletions

scripts/gen-s-parser.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@
150150
("i64.rotr", "makeBinary(BinaryOp::RotRInt64)"),
151151
("i64.add128", "makeWideIntAddSub(WideIntAddSubOp::AddInt128)"),
152152
("i64.sub128", "makeWideIntAddSub(WideIntAddSubOp::SubInt128)"),
153+
("i64.mul_wide_s", "makeWideIntMul(WideIntMulOp::MulWideSInt64)"),
154+
("i64.mul_wide_u", "makeWideIntMul(WideIntMulOp::MulWideUInt64)"),
153155
("f32.abs", "makeUnary(UnaryOp::AbsFloat32)"),
154156
("f32.neg", "makeUnary(UnaryOp::NegFloat32)"),
155157
("f32.ceil", "makeUnary(UnaryOp::CeilFloat32)"),

scripts/test/shared.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,6 @@ def get_tests(test_dir, extensions=[], recursive=False):
404404
'threads/atomic.wast',
405405
]
406406
SPEC_TESTSUITE_PROPOSALS_TO_SKIP = [
407-
'wide-arithmetic',
408407
]
409408

410409
# Paths are relative to the test/spec/testsuite directory

src/gen-s-parser.inc

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3991,12 +3991,34 @@ switch (buf[0]) {
39913991
default: goto parse_error;
39923992
}
39933993
}
3994-
case 'm':
3995-
if (op == "i64.mul"sv) {
3996-
CHECK_ERR(makeBinary(ctx, pos, annotations, BinaryOp::MulInt64));
3997-
return Ok{};
3994+
case 'm': {
3995+
switch (buf[7]) {
3996+
case '\0':
3997+
if (op == "i64.mul"sv) {
3998+
CHECK_ERR(makeBinary(ctx, pos, annotations, BinaryOp::MulInt64));
3999+
return Ok{};
4000+
}
4001+
goto parse_error;
4002+
case '_': {
4003+
switch (buf[13]) {
4004+
case 's':
4005+
if (op == "i64.mul_wide_s"sv) {
4006+
CHECK_ERR(makeWideIntMul(ctx, pos, annotations, WideIntMulOp::MulWideSInt64));
4007+
return Ok{};
4008+
}
4009+
goto parse_error;
4010+
case 'u':
4011+
if (op == "i64.mul_wide_u"sv) {
4012+
CHECK_ERR(makeWideIntMul(ctx, pos, annotations, WideIntMulOp::MulWideUInt64));
4013+
return Ok{};
4014+
}
4015+
goto parse_error;
4016+
default: goto parse_error;
4017+
}
4018+
}
4019+
default: goto parse_error;
39984020
}
3999-
goto parse_error;
4021+
}
40004022
case 'n':
40014023
if (op == "i64.ne"sv) {
40024024
CHECK_ERR(makeBinary(ctx, pos, annotations, BinaryOp::NeInt64));

src/interpreter/interpreter.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ struct ExpressionInterpreter : OverriddenVisitor<ExpressionInterpreter, Flow> {
217217
}
218218
}
219219
Flow visitWideIntAddSub(WideIntAddSub* curr) { WASM_UNREACHABLE("TODO"); }
220+
Flow visitWideIntMul(WideIntMul* curr) { WASM_UNREACHABLE("TODO"); }
220221
Flow visitSelect(Select* curr) { WASM_UNREACHABLE("TODO"); }
221222
Flow visitDrop(Drop* curr) { WASM_UNREACHABLE("TODO"); }
222223
Flow visitReturn(Return* curr) { WASM_UNREACHABLE("TODO"); }

src/ir/ReFinalize.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ void ReFinalize::visitConst(Const* curr) { curr->finalize(); }
110110
void ReFinalize::visitUnary(Unary* curr) { curr->finalize(); }
111111
void ReFinalize::visitBinary(Binary* curr) { curr->finalize(); }
112112
void ReFinalize::visitWideIntAddSub(WideIntAddSub* curr) { curr->finalize(); }
113+
void ReFinalize::visitWideIntMul(WideIntMul* curr) { curr->finalize(); }
113114
void ReFinalize::visitSelect(Select* curr) { curr->finalize(); }
114115
void ReFinalize::visitDrop(Drop* curr) { curr->finalize(); }
115116
void ReFinalize::visitReturn(Return* curr) { curr->finalize(); }

src/ir/child-typer.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,11 @@ template<typename Subtype> struct ChildTyper : OverriddenVisitor<Subtype> {
712712
note(&curr->rightHigh, Type::i64);
713713
}
714714

715+
void visitWideIntMul(WideIntMul* curr) {
716+
note(&curr->left, Type::i64);
717+
note(&curr->right, Type::i64);
718+
}
719+
715720
void visitSelect(Select* curr, std::optional<Type> type = std::nullopt) {
716721
if (type) {
717722
note(&curr->ifTrue, *type);

src/ir/cost.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,9 @@ struct CostAnalyzer : public OverriddenVisitor<CostAnalyzer, CostType> {
579579
return 1 + visit(curr->leftLow) + visit(curr->leftHigh) +
580580
visit(curr->rightLow) + visit(curr->rightHigh);
581581
}
582+
CostType visitWideIntMul(WideIntMul* curr) {
583+
return 4 + visit(curr->left) + visit(curr->right);
584+
}
582585
CostType visitSelect(Select* curr) {
583586
return 1 + visit(curr->condition) + visit(curr->ifTrue) +
584587
visit(curr->ifFalse);

src/ir/effects.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -946,6 +946,7 @@ class EffectAnalyzer {
946946
}
947947
}
948948
void visitWideIntAddSub(WideIntAddSub* curr) {}
949+
void visitWideIntMul(WideIntMul* curr) {}
949950
void visitSelect(Select* curr) {}
950951
void visitDrop(Drop* curr) {}
951952
void visitReturn(Return* curr) { parent.branchesOut = true; }

src/ir/possible-contents.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,7 @@ struct InfoCollector
635635
}
636636
void visitBinary(Binary* curr) { addRoot(curr); }
637637
void visitWideIntAddSub(WideIntAddSub* curr) { addRoot(curr); }
638+
void visitWideIntMul(WideIntMul* curr) { addRoot(curr); }
638639
void visitSelect(Select* curr) {
639640
receiveChildValue(curr->ifTrue, curr);
640641
receiveChildValue(curr->ifFalse, curr);

src/ir/subtype-exprs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ struct SubtypingDiscoverer : public OverriddenVisitor<SubType> {
214214
void visitUnary(Unary* curr) {}
215215
void visitBinary(Binary* curr) {}
216216
void visitWideIntAddSub(WideIntAddSub* curr) {}
217+
void visitWideIntMul(WideIntMul* curr) {}
217218
void visitSelect(Select* curr) {
218219
self()->noteSubtype(curr->ifTrue, curr);
219220
self()->noteSubtype(curr->ifFalse, curr);

0 commit comments

Comments
 (0)