Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/asm2wasm.h
Original file line number Diff line number Diff line change
Expand Up @@ -1109,9 +1109,9 @@ Function* Asm2WasmBuilder::processFunction(Ref ast) {
flip->right = get();
flip->type = i32;
auto select = allocator.alloc<Select>();
select->condition = isNegative;
select->ifTrue = flip;
select->ifFalse = get();
select->condition = isNegative;
select->type = i32;
block->list.push_back(select);
block->type = i32;
Expand Down
3 changes: 2 additions & 1 deletion src/s2wasm.h
Original file line number Diff line number Diff line change
Expand Up @@ -688,9 +688,10 @@ class S2WasmBuilder {
skipComma();
auto curr = allocator.alloc<Select>();
auto inputs = getInputs(3);
curr->condition = inputs[0];
curr->ifTrue = inputs[1];
curr->ifFalse = inputs[2];
curr->condition = inputs[0];
assert(curr->condition->type == i32);
curr->type = type;
setOutput(curr, assign);
};
Expand Down
6 changes: 3 additions & 3 deletions src/wasm-interpreter.h
Original file line number Diff line number Diff line change
Expand Up @@ -620,13 +620,13 @@ class ModuleInstance {
}
Flow visitSelect(Select *curr) {
NOTE_ENTER("Select");
Flow condition = visit(curr->condition);
if (condition.breaking()) return condition;
NOTE_EVAL1(condition.value);
Flow ifTrue = visit(curr->ifTrue);
if (ifTrue.breaking()) return ifTrue;
Flow ifFalse = visit(curr->ifFalse);
if (ifFalse.breaking()) return ifFalse;
Flow condition = visit(curr->condition);
if (condition.breaking()) return condition;
NOTE_EVAL1(condition.value);
return condition.value.geti32() ? ifTrue : ifFalse; // ;-)
}
Flow visitReturn(Return *curr) {
Expand Down
6 changes: 3 additions & 3 deletions src/wasm-s-parser.h
Original file line number Diff line number Diff line change
Expand Up @@ -633,9 +633,9 @@ class SExpressionWasmBuilder {

Expression* makeSelect(Element& s, WasmType type) {
auto ret = allocator.alloc<Select>();
ret->condition = parseExpression(s[1]);
ret->ifTrue = parseExpression(s[2]);
ret->ifFalse = parseExpression(s[3]);
ret->ifTrue = parseExpression(s[1]);
ret->ifFalse = parseExpression(s[2]);
ret->condition = parseExpression(s[3]);
ret->type = type;
return ret;
}
Expand Down
6 changes: 3 additions & 3 deletions src/wasm.h
Original file line number Diff line number Diff line change
Expand Up @@ -911,15 +911,15 @@ class Select : public Expression {
public:
Select() : Expression(SelectId) {}

Expression *condition, *ifTrue, *ifFalse;
Expression *ifTrue, *ifFalse, *condition;

std::ostream& doPrint(std::ostream &o, unsigned indent) {
o << '(';
prepareColor(o) << printWasmType(type) << ".select";
incIndent(o, indent);
printFullLine(o, indent, condition);
printFullLine(o, indent, ifTrue);
printFullLine(o, indent, ifFalse);
printFullLine(o, indent, condition);
return decIndent(o, indent);
}

Expand Down Expand Up @@ -1447,9 +1447,9 @@ struct ChildWalker : public WasmWalkerBase<ChildWalker<ParentType>> {
parent.walk(curr->right);
}
void visitSelect(Select *curr) {
parent.walk(curr->condition);
parent.walk(curr->ifTrue);
parent.walk(curr->ifFalse);
parent.walk(curr->condition);
}
void visitReturn(Return *curr) {
parent.walk(curr->value);
Expand Down
22 changes: 11 additions & 11 deletions src/wasm2asm.h
Original file line number Diff line number Diff line change
Expand Up @@ -463,7 +463,7 @@ void Wasm2AsmBuilder::scanFunctionBody(Expression* curr) {
}
}
void visitSelect(Select *curr) {
if (parent->isStatement(curr->condition) || parent->isStatement(curr->ifTrue) || parent->isStatement(curr->ifFalse)) {
if (parent->isStatement(curr->ifTrue) || parent->isStatement(curr->ifFalse) || parent->isStatement(curr->condition)) {
parent->setStatement(curr);
}
}
Expand Down Expand Up @@ -1057,32 +1057,32 @@ Ref Wasm2AsmBuilder::processFunctionBody(Expression* curr, IString result) {
}
Ref visitSelect(Select *curr) {
if (isStatement(curr)) {
ScopedTemp tempCondition(i32, parent);
GetLocal fakeCondition;
fakeCondition.name = tempCondition.getName();
ScopedTemp tempIfTrue(curr->ifTrue->type, parent);
GetLocal fakeLocalIfTrue;
fakeLocalIfTrue.name = tempIfTrue.getName();
ScopedTemp tempIfFalse(curr->ifFalse->type, parent);
GetLocal fakeLocalIfFalse;
fakeLocalIfFalse.name = tempIfFalse.getName();
ScopedTemp tempCondition(i32, parent);
GetLocal fakeCondition;
fakeCondition.name = tempCondition.getName();
Select fakeSelect = *curr;
fakeSelect.condition = &fakeCondition;
fakeSelect.ifTrue = &fakeLocalIfTrue;
fakeSelect.ifFalse = &fakeLocalIfFalse;
Ref ret = blockify(visitAndAssign(curr->condition, tempCondition));
flattenAppend(ret, visitAndAssign(curr->ifTrue, tempIfTrue));
fakeSelect.condition = &fakeCondition;
Ref ret = blockify(visitAndAssign(curr->ifTrue, tempIfTrue));
flattenAppend(ret, visitAndAssign(curr->ifFalse, tempIfFalse));
flattenAppend(ret, visitAndAssign(curr->condition, tempCondition));
flattenAppend(ret, visitAndAssign(&fakeSelect, result));
return ret;
}
// normal select
Ref condition = visit(curr->condition, EXPRESSION_RESULT);
Ref ifTrue = visit(curr->ifTrue, EXPRESSION_RESULT);
Ref ifFalse = visit(curr->ifFalse, EXPRESSION_RESULT);
ScopedTemp tempCondition(i32, parent),
tempIfTrue(curr->type, parent),
tempIfFalse(curr->type, parent);
Ref condition = visit(curr->condition, EXPRESSION_RESULT);
ScopedTemp tempIfTrue(curr->type, parent),
tempIfFalse(curr->type, parent),
tempCondition(i32, parent);
return
ValueBuilder::makeSeq(
ValueBuilder::makeAssign(tempCondition.getAstName(), condition),
Expand Down
Loading