[turbofan] Second round of optimisation for unordered comparisons on arm/arm64.

Avoid explicitly branching to the false label on unordered when the condition
on the true branch will not catch the unordered case and let the code fall
through.

R=bmeurer@chromium.org

Review URL: https://codereview.chromium.org/794203003

Cr-Commit-Position: refs/heads/master@{#25787}
This commit is contained in:
baptiste.afsa 2014-12-11 09:54:22 -08:00 committed by Commit bot
parent 5913c7cc3f
commit 6459dabdae
2 changed files with 18 additions and 12 deletions

View File

@ -687,8 +687,9 @@ void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) {
Label* flabel = branch->false_label;
switch (branch->condition) {
case kUnorderedEqual:
__ b(vs, flabel);
// Fall through.
// The "eq" condition will not catch the unordered case.
// The jump/fall through to false label will be used if the comparison
// was unordered.
case kEqual:
__ b(eq, tlabel);
break;
@ -711,8 +712,9 @@ void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) {
__ b(gt, tlabel);
break;
case kUnorderedLessThan:
__ b(vs, flabel);
// Fall through.
// The "lo" condition will not catch the unordered case.
// The jump/fall through to false label will be used if the comparison
// was unordered.
case kUnsignedLessThan:
__ b(lo, tlabel);
break;
@ -723,8 +725,9 @@ void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) {
__ b(hs, tlabel);
break;
case kUnorderedLessThanOrEqual:
__ b(vs, flabel);
// Fall through.
// The "ls" condition will not catch the unordered case.
// The jump/fall through to false label will be used if the comparison
// was unordered.
case kUnsignedLessThanOrEqual:
__ b(ls, tlabel);
break;

View File

@ -781,8 +781,9 @@ void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) {
} else {
switch (condition) {
case kUnorderedEqual:
__ B(vs, flabel);
// Fall through.
// The "eq" condition will not catch the unordered case.
// The jump/fall through to false label will be used if the comparison
// was unordered.
case kEqual:
__ B(eq, tlabel);
break;
@ -805,8 +806,9 @@ void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) {
__ B(gt, tlabel);
break;
case kUnorderedLessThan:
__ B(vs, flabel);
// Fall through.
// The "lo" condition will not catch the unordered case.
// The jump/fall through to false label will be used if the comparison
// was unordered.
case kUnsignedLessThan:
__ B(lo, tlabel);
break;
@ -817,8 +819,9 @@ void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) {
__ B(hs, tlabel);
break;
case kUnorderedLessThanOrEqual:
__ B(vs, flabel);
// Fall through.
// The "ls" condition will not catch the unordered case.
// The jump/fall through to false label will be used if the comparison
// was unordered.
case kUnsignedLessThanOrEqual:
__ B(ls, tlabel);
break;