From: plind44@gmail.com Date: Mon, 7 Apr 2014 16:37:30 +0000 (+0000) Subject: MIPS: Fixed flooring division by -1. X-Git-Tag: upstream/4.7.83~9778 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fcdb87f8291458587b5e61b976843ab879d85e0f;p=platform%2Fupstream%2Fv8.git MIPS: Fixed flooring division by -1. Port r20544 (a64196c) Original commit message: We should avoid ASR #0 on ARM. Simplified and improved code a bit while we're there on all platforms. Human brains are very bad at understanding nested structures... BUG=v8:3259 LOG=y R=plind44@gmail.com Review URL: https://codereview.chromium.org/227583003 Patch from Balazs Kilvady . git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20553 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc index 89620d8..7c3f28f 100644 --- a/src/mips/lithium-codegen-mips.cc +++ b/src/mips/lithium-codegen-mips.cc @@ -1322,25 +1322,27 @@ void LCodeGen::DoFlooringDivByPowerOf2I(LFlooringDivByPowerOf2I* instr) { if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { DeoptimizeIf(eq, instr->environment(), result, Operand(zero_reg)); } - if (instr->hydrogen()->CheckFlag(HValue::kLeftCanBeMinInt)) { - // Note that we could emit branch-free code, but that would need one more - // register. - __ Xor(at, scratch, result); - if (divisor == -1) { - DeoptimizeIf(ge, instr->environment(), at, Operand(zero_reg)); - __ sra(result, dividend, shift); - } else { - Label no_overflow, done; - __ Branch(&no_overflow, lt, at, Operand(zero_reg)); - __ li(result, Operand(kMinInt / divisor)); - __ Branch(&done); - __ bind(&no_overflow); - __ sra(result, dividend, shift); - __ bind(&done); - } - } else { + + // If the negation could not overflow, simply shifting is OK. + if (!instr->hydrogen()->CheckFlag(HValue::kLeftCanBeMinInt)) { __ sra(result, dividend, shift); + return; + } + + // Dividing by -1 is basically negation, unless we overflow. + __ Xor(at, scratch, result); + if (divisor == -1) { + DeoptimizeIf(ge, instr->environment(), at, Operand(zero_reg)); + return; } + + Label no_overflow, done; + __ Branch(&no_overflow, lt, at, Operand(zero_reg)); + __ li(result, Operand(kMinInt / divisor)); + __ Branch(&done); + __ bind(&no_overflow); + __ sra(result, dividend, shift); + __ bind(&done); }