Skip to content

Commit a1c0933

Browse files
Mul / div support
1 parent 798b1b6 commit a1c0933

31 files changed

Lines changed: 1280 additions & 316 deletions

overview.md

Lines changed: 786 additions & 0 deletions
Large diffs are not rendered by default.

patch.py

Lines changed: 263 additions & 0 deletions
Large diffs are not rendered by default.

scripts/gen-s-parser.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,8 @@
148148
("i64.rotr", "makeBinary(BinaryOp::RotRInt64)"),
149149
("i64.add128", "makeWideIntAddSub(WideIntAddSubOp::AddInt128)"),
150150
("i64.sub128", "makeWideIntAddSub(WideIntAddSubOp::SubInt128)"),
151+
("i64.mul_wide_s", "makeWideIntMul(WideIntMulOp::MulWideSInt64)"),
152+
("i64.mul_wide_u", "makeWideIntMul(WideIntMulOp::MulWideUInt64)"),
151153
("f32.abs", "makeUnary(UnaryOp::AbsFloat32)"),
152154
("f32.neg", "makeUnary(UnaryOp::NegFloat32)"),
153155
("f32.ceil", "makeUnary(UnaryOp::CeilFloat32)"),

scripts/test/shared.py

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

409408
# 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
@@ -3969,12 +3969,34 @@ switch (buf[0]) {
39693969
default: goto parse_error;
39703970
}
39713971
}
3972-
case 'm':
3973-
if (op == "i64.mul"sv) {
3974-
CHECK_ERR(makeBinary(ctx, pos, annotations, BinaryOp::MulInt64));
3975-
return Ok{};
3972+
case 'm': {
3973+
switch (buf[7]) {
3974+
case '\0':
3975+
if (op == "i64.mul"sv) {
3976+
CHECK_ERR(makeBinary(ctx, pos, annotations, BinaryOp::MulInt64));
3977+
return Ok{};
3978+
}
3979+
goto parse_error;
3980+
case '_': {
3981+
switch (buf[13]) {
3982+
case 's':
3983+
if (op == "i64.mul_wide_s"sv) {
3984+
CHECK_ERR(makeWideIntMul(ctx, pos, annotations, WideIntMulOp::MulWideSInt64));
3985+
return Ok{};
3986+
}
3987+
goto parse_error;
3988+
case 'u':
3989+
if (op == "i64.mul_wide_u"sv) {
3990+
CHECK_ERR(makeWideIntMul(ctx, pos, annotations, WideIntMulOp::MulWideUInt64));
3991+
return Ok{};
3992+
}
3993+
goto parse_error;
3994+
default: goto parse_error;
3995+
}
3996+
}
3997+
default: goto parse_error;
39763998
}
3977-
goto parse_error;
3999+
}
39784000
case 'n':
39794001
if (op == "i64.ne"sv) {
39804002
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
@@ -710,6 +710,11 @@ template<typename Subtype> struct ChildTyper : OverriddenVisitor<Subtype> {
710710
note(&curr->rightHigh, Type::i64);
711711
}
712712

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

src/ir/cost.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,9 @@ struct CostAnalyzer : public OverriddenVisitor<CostAnalyzer, CostType> {
577577
return 1 + visit(curr->leftLow) + visit(curr->leftHigh) +
578578
visit(curr->rightLow) + visit(curr->rightHigh);
579579
}
580+
CostType visitWideIntMul(WideIntMul* curr) {
581+
return 1 + visit(curr->left) + visit(curr->right);
582+
}
580583
CostType visitSelect(Select* curr) {
581584
return 1 + visit(curr->condition) + visit(curr->ifTrue) +
582585
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; }

0 commit comments

Comments
 (0)