From 6459dabdaeaa5bec7ce6b83b7aafc43942a8cd8e Mon Sep 17 00:00:00 2001 From: "baptiste.afsa" Date: Thu, 11 Dec 2014 09:54:22 -0800 Subject: [PATCH] [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} --- src/compiler/arm/code-generator-arm.cc | 15 +++++++++------ src/compiler/arm64/code-generator-arm64.cc | 15 +++++++++------ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/compiler/arm/code-generator-arm.cc b/src/compiler/arm/code-generator-arm.cc index dcf03a4a29..cfa4de9b3c 100644 --- a/src/compiler/arm/code-generator-arm.cc +++ b/src/compiler/arm/code-generator-arm.cc @@ -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; diff --git a/src/compiler/arm64/code-generator-arm64.cc b/src/compiler/arm64/code-generator-arm64.cc index 8cd03784e5..cc46fd677e 100644 --- a/src/compiler/arm64/code-generator-arm64.cc +++ b/src/compiler/arm64/code-generator-arm64.cc @@ -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;