Skip to content

Commit ab7e625

Browse files
committed
Prototype i32x4.widen_i8x16_{s,u}
As proposed in WebAssembly/simd#395. Note that the other instructions in the proposal have not been implemented in LLVM or in V8, so there is no need to implement them in Binaryen right now either. This PR introduces a new expression class for the new instructions because they uniquely take an immediate argument identifying which portion of the input vector to widen.
1 parent eafb0a4 commit ab7e625

23 files changed

+197
-33
lines changed

scripts/gen-s-parser.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,8 @@
522522
("i32x4.trunc_sat_f64x2_zero_u", "makeUnary(s, UnaryOp::TruncSatZeroUVecF64x2ToVecI32x4)"),
523523
("f32x4.demote_f64x2_zero", "makeUnary(s, UnaryOp::DemoteZeroVecF64x2ToVecF32x4)"),
524524
("f64x2.promote_low_f32x4", "makeUnary(s, UnaryOp::PromoteLowVecF32x4ToVecF64x2)"),
525+
("i32x4.widen_i8x16_s", "makeSIMDWiden(s, SIMDWidenOp::WidenSVecI8x16ToVecI32x4)"),
526+
("i32x4.widen_i8x16_u", "makeSIMDWiden(s, SIMDWidenOp::WidenUVecI8x16ToVecI32x4)"),
525527

526528
# prefetch instructions
527529
("prefetch.t", "makePrefetch(s, PrefetchOp::PrefetchTemporal)"),

src/gen-s-parser.inc

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1832,6 +1832,17 @@ switch (op[0]) {
18321832
default: goto parse_error;
18331833
}
18341834
}
1835+
case 'i': {
1836+
switch (op[18]) {
1837+
case 's':
1838+
if (strcmp(op, "i32x4.widen_i8x16_s") == 0) { return makeSIMDWiden(s, SIMDWidenOp::WidenSVecI8x16ToVecI32x4); }
1839+
goto parse_error;
1840+
case 'u':
1841+
if (strcmp(op, "i32x4.widen_i8x16_u") == 0) { return makeSIMDWiden(s, SIMDWidenOp::WidenUVecI8x16ToVecI32x4); }
1842+
goto parse_error;
1843+
default: goto parse_error;
1844+
}
1845+
}
18351846
case 'l': {
18361847
switch (op[22]) {
18371848
case 's':

src/ir/ReFinalize.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ void ReFinalize::visitSIMDLoad(SIMDLoad* curr) { curr->finalize(); }
112112
void ReFinalize::visitSIMDLoadStoreLane(SIMDLoadStoreLane* curr) {
113113
curr->finalize();
114114
}
115+
void ReFinalize::visitSIMDWiden(SIMDWiden* curr) { curr->finalize(); }
115116
void ReFinalize::visitPrefetch(Prefetch* curr) { curr->finalize(); }
116117
void ReFinalize::visitMemoryInit(MemoryInit* curr) { curr->finalize(); }
117118
void ReFinalize::visitDataDrop(DataDrop* curr) { curr->finalize(); }

src/ir/cost.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,7 @@ struct CostAnalyzer : public OverriddenVisitor<CostAnalyzer, Index> {
540540
Index visitSIMDShift(SIMDShift* curr) {
541541
return 1 + visit(curr->vec) + visit(curr->shift);
542542
}
543+
Index visitSIMDWiden(SIMDWiden* curr) { return 1 + visit(curr->vec); }
543544
Index visitSIMDShuffle(SIMDShuffle* curr) {
544545
return 1 + visit(curr->left) + visit(curr->right);
545546
}

src/ir/effects.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,7 @@ class EffectAnalyzer {
430430
}
431431
parent.implicitTrap = true;
432432
}
433+
void visitSIMDWiden(SIMDWiden* curr) {}
433434
void visitPrefetch(Prefetch* curr) {
434435
// Do not reorder with respect to other memory ops
435436
parent.writesMemory = true;

src/passes/Print.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,19 @@ struct PrintExpressionContents
671671
}
672672
o << " " << int(curr->index);
673673
}
674+
void visitSIMDWiden(SIMDWiden* curr) {
675+
prepareColor(o);
676+
switch (curr->op) {
677+
case WidenSVecI8x16ToVecI32x4:
678+
o << "i32x4.widen_i8x16_s ";
679+
break;
680+
case WidenUVecI8x16ToVecI32x4:
681+
o << "i32x4.widen_i8x16_u ";
682+
break;
683+
}
684+
restoreNormalColor(o);
685+
o << int(curr->index);
686+
}
674687
void visitPrefetch(Prefetch* curr) {
675688
prepareColor(o);
676689
switch (curr->op) {
@@ -2303,6 +2316,13 @@ struct PrintSExpression : public OverriddenVisitor<PrintSExpression> {
23032316
printFullLine(curr->vec);
23042317
decIndent();
23052318
}
2319+
void visitSIMDWiden(SIMDWiden* curr) {
2320+
o << '(';
2321+
PrintExpressionContents(currFunction, o).visit(curr);
2322+
incIndent();
2323+
printFullLine(curr->vec);
2324+
decIndent();
2325+
}
23062326
void visitPrefetch(Prefetch* curr) {
23072327
o << '(';
23082328
PrintExpressionContents(currFunction, o).visit(curr);

src/wasm-binary.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -979,6 +979,9 @@ enum ASTNodes {
979979
F32x4DemoteZeroF64x2 = 0x57,
980980
F64x2PromoteLowF32x4 = 0x69,
981981

982+
I32x4WidenSI8x16 = 0x67,
983+
I32x4WidenUI8x16 = 0x68,
984+
982985
// prefetch opcodes
983986

984987
PrefetchT = 0xc5,
@@ -1521,6 +1524,7 @@ class WasmBinaryBuilder {
15211524
bool maybeVisitSIMDShift(Expression*& out, uint32_t code);
15221525
bool maybeVisitSIMDLoad(Expression*& out, uint32_t code);
15231526
bool maybeVisitSIMDLoadStoreLane(Expression*& out, uint32_t code);
1527+
bool maybeVisitSIMDWiden(Expression*& out, uint32_t code);
15241528
bool maybeVisitPrefetch(Expression*& out, uint32_t code);
15251529
bool maybeVisitMemoryInit(Expression*& out, uint32_t code);
15261530
bool maybeVisitDataDrop(Expression*& out, uint32_t code);

src/wasm-delegations-fields.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,14 @@ switch (DELEGATE_ID) {
386386
DELEGATE_END(SIMDLoadStoreLane);
387387
break;
388388
}
389+
case Expression::Id::SIMDWidenId: {
390+
DELEGATE_START(SIMDWiden);
391+
DELEGATE_FIELD_CHILD(SIMDWiden, vec);
392+
DELEGATE_FIELD_INT(SIMDWiden, op);
393+
DELEGATE_FIELD_INT(SIMDWiden, index);
394+
DELEGATE_END(SIMDWiden);
395+
break;
396+
}
389397
case Expression::Id::PrefetchId: {
390398
DELEGATE_START(Prefetch);
391399
DELEGATE_FIELD_CHILD(Prefetch, ptr);

src/wasm-delegations.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ DELEGATE(SIMDTernary);
4040
DELEGATE(SIMDShift);
4141
DELEGATE(SIMDLoad);
4242
DELEGATE(SIMDLoadStoreLane);
43+
DELEGATE(SIMDWiden);
4344
DELEGATE(Prefetch);
4445
DELEGATE(MemoryInit);
4546
DELEGATE(DataDrop);

src/wasm-interpreter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1132,6 +1132,7 @@ class ExpressionRunner : public OverriddenVisitor<SubType, Flow> {
11321132
}
11331133
WASM_UNREACHABLE("invalid op");
11341134
}
1135+
Flow visitSIMDWiden(SIMDWiden* curr) { WASM_UNREACHABLE("unimp"); }
11351136
Flow visitSelect(Select* curr) {
11361137
NOTE_ENTER("Select");
11371138
Flow ifTrue = visit(curr->ifTrue);

0 commit comments

Comments
 (0)