From: dusan.milosavljevic Date: Fri, 8 May 2015 09:42:42 +0000 (-0700) Subject: MIPS [turbofan]: Improve fpu branch assembling for unordered conditions. X-Git-Tag: upstream/4.7.83~2725 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1fbe587b0d881ce5422a2b3328d404e68b962fb2;p=platform%2Fupstream%2Fv8.git MIPS [turbofan]: Improve fpu branch assembling for unordered conditions. TEST= BUG= Review URL: https://codereview.chromium.org/1124023005 Cr-Commit-Position: refs/heads/master@{#28315} --- diff --git a/src/compiler/mips/code-generator-mips.cc b/src/compiler/mips/code-generator-mips.cc index ac0d2e2..0e45172 100644 --- a/src/compiler/mips/code-generator-mips.cc +++ b/src/compiler/mips/code-generator-mips.cc @@ -829,30 +829,25 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) { out << "Unsupported " << #opcode << " condition: \"" << condition << "\""; \ UNIMPLEMENTED(); -static bool convertCondition(FlagsCondition condition, Condition& cc, - bool& acceptNaN) { - acceptNaN = false; +static bool convertCondition(FlagsCondition condition, Condition& cc) { switch (condition) { case kEqual: cc = eq; return true; case kNotEqual: cc = ne; - acceptNaN = true; return true; case kUnsignedLessThan: cc = lt; return true; case kUnsignedGreaterThanOrEqual: - cc = ge; - acceptNaN = true; + cc = uge; return true; case kUnsignedLessThanOrEqual: cc = le; return true; case kUnsignedGreaterThan: - cc = gt; - acceptNaN = true; + cc = ugt; return true; default: break; @@ -895,27 +890,19 @@ void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) { if (!branch->fallthru) __ Branch(flabel); // no fallthru to flabel. } else if (instr->arch_opcode() == kMipsCmpS) { - // TODO(dusmil) optimize unordered checks to use fewer instructions - // even if we have to unfold BranchF macro. - bool acceptNaN = false; - if (!convertCondition(branch->condition, cc, acceptNaN)) { + if (!convertCondition(branch->condition, cc)) { UNSUPPORTED_COND(kMips64CmpS, branch->condition); } - Label* nan = acceptNaN ? tlabel : flabel; - __ BranchF32(tlabel, nan, cc, i.InputSingleRegister(0), + __ BranchF32(tlabel, NULL, cc, i.InputSingleRegister(0), i.InputSingleRegister(1)); if (!branch->fallthru) __ Branch(flabel); // no fallthru to flabel. } else if (instr->arch_opcode() == kMipsCmpD) { - // TODO(dusmil) optimize unordered checks to use fewer instructions - // even if we have to unfold BranchF macro. - bool acceptNaN = false; - if (!convertCondition(branch->condition, cc, acceptNaN)) { + if (!convertCondition(branch->condition, cc)) { UNSUPPORTED_COND(kMips64CmpD, branch->condition); } - Label* nan = acceptNaN ? tlabel : flabel; - __ BranchF64(tlabel, nan, cc, i.InputDoubleRegister(0), + __ BranchF64(tlabel, NULL, cc, i.InputDoubleRegister(0), i.InputDoubleRegister(1)); if (!branch->fallthru) __ Branch(flabel); // no fallthru to flabel. diff --git a/src/compiler/mips64/code-generator-mips64.cc b/src/compiler/mips64/code-generator-mips64.cc index 6aa735d..5fcf95b 100644 --- a/src/compiler/mips64/code-generator-mips64.cc +++ b/src/compiler/mips64/code-generator-mips64.cc @@ -897,30 +897,25 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) { out << "Unsupported " << #opcode << " condition: \"" << condition << "\""; \ UNIMPLEMENTED(); -static bool convertCondition(FlagsCondition condition, Condition& cc, - bool& acceptNaN) { - acceptNaN = false; +static bool convertCondition(FlagsCondition condition, Condition& cc) { switch (condition) { case kEqual: cc = eq; return true; case kNotEqual: cc = ne; - acceptNaN = true; return true; case kUnsignedLessThan: cc = lt; return true; case kUnsignedGreaterThanOrEqual: - cc = ge; - acceptNaN = true; + cc = uge; return true; case kUnsignedLessThanOrEqual: cc = le; return true; case kUnsignedGreaterThan: - cc = gt; - acceptNaN = true; + cc = ugt; return true; default: break; @@ -960,27 +955,19 @@ void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) { if (!branch->fallthru) __ Branch(flabel); // no fallthru to flabel. } else if (instr->arch_opcode() == kMips64CmpS) { - // TODO(dusmil) optimize unordered checks to use fewer instructions - // even if we have to unfold BranchF macro. - bool acceptNaN = false; - if (!convertCondition(branch->condition, cc, acceptNaN)) { + if (!convertCondition(branch->condition, cc)) { UNSUPPORTED_COND(kMips64CmpS, branch->condition); } - Label* nan = acceptNaN ? tlabel : flabel; - __ BranchF32(tlabel, nan, cc, i.InputSingleRegister(0), + __ BranchF32(tlabel, NULL, cc, i.InputSingleRegister(0), i.InputSingleRegister(1)); if (!branch->fallthru) __ Branch(flabel); // no fallthru to flabel. } else if (instr->arch_opcode() == kMips64CmpD) { - // TODO(dusmil) optimize unordered checks to use less instructions - // even if we have to unfold BranchF macro. - bool acceptNaN = false; - if (!convertCondition(branch->condition, cc, acceptNaN)) { + if (!convertCondition(branch->condition, cc)) { UNSUPPORTED_COND(kMips64CmpD, branch->condition); } - Label* nan = acceptNaN ? tlabel : flabel; - __ BranchF64(tlabel, nan, cc, i.InputDoubleRegister(0), + __ BranchF64(tlabel, NULL, cc, i.InputDoubleRegister(0), i.InputDoubleRegister(1)); if (!branch->fallthru) __ Branch(flabel); // no fallthru to flabel.