From: m.m.capewell@googlemail.com Date: Wed, 14 May 2014 14:34:37 +0000 (+0000) Subject: Fix FlooringDivByPowerOf2I on ARM/ARM64 X-Git-Tag: upstream/4.7.83~9126 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=41975b90c017d26d018bcdc6143020b5f5e0bf04;p=platform%2Fupstream%2Fv8.git Fix FlooringDivByPowerOf2I on ARM/ARM64 Fix for divisor=1, found during code inspection. We can't hit this bug, due to HDiv::Canonicalize() discarding the operation, but it might avoid a future bug hunt. Patch also includes a small tidying of the ARM64 code. BUG= R=ulan@chromium.org Review URL: https://codereview.chromium.org/280883003 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21313 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc index 2879d64..86aa0b5 100644 --- a/src/arm/lithium-codegen-arm.cc +++ b/src/arm/lithium-codegen-arm.cc @@ -1435,9 +1435,14 @@ void LCodeGen::DoFlooringDivByPowerOf2I(LFlooringDivByPowerOf2I* instr) { Register result = ToRegister(instr->result()); int32_t divisor = instr->divisor(); + // If the divisor is 1, return the dividend. + if (divisor == 1) { + __ Move(result, dividend); + return; + } + // If the divisor is positive, things are easy: There can be no deopts and we // can simply do an arithmetic right shift. - if (divisor == 1) return; int32_t shift = WhichPowerOf2Abs(divisor); if (divisor > 1) { __ mov(result, Operand(dividend, ASR, shift)); diff --git a/src/arm64/lithium-codegen-arm64.cc b/src/arm64/lithium-codegen-arm64.cc index bcd7898..e070146 100644 --- a/src/arm64/lithium-codegen-arm64.cc +++ b/src/arm64/lithium-codegen-arm64.cc @@ -3879,9 +3879,14 @@ void LCodeGen::DoFlooringDivByPowerOf2I(LFlooringDivByPowerOf2I* instr) { Register result = ToRegister32(instr->result()); int32_t divisor = instr->divisor(); + // If the divisor is 1, return the dividend. + if (divisor == 1) { + __ Mov(result, dividend, kDiscardForSameWReg); + return; + } + // If the divisor is positive, things are easy: There can be no deopts and we // can simply do an arithmetic right shift. - if (divisor == 1) return; int32_t shift = WhichPowerOf2Abs(divisor); if (divisor > 1) { __ Mov(result, Operand(dividend, ASR, shift)); @@ -3906,14 +3911,8 @@ void LCodeGen::DoFlooringDivByPowerOf2I(LFlooringDivByPowerOf2I* instr) { return; } - // Using a conditional data processing instruction would need 1 more register. - Label not_kmin_int, done; - __ B(vc, ¬_kmin_int); - __ Mov(result, kMinInt / divisor); - __ B(&done); - __ bind(¬_kmin_int); - __ Mov(result, Operand(dividend, ASR, shift)); - __ bind(&done); + __ Asr(result, dividend, shift); + __ Csel(result, result, kMinInt / divisor, vc); }