From: danno@chromium.org Date: Mon, 29 Oct 2012 15:10:21 +0000 (+0000) Subject: MIPS: Cleanup handling of shifts: SHR can deoptimize only when its a shift by 0,... X-Git-Tag: upstream/4.7.83~15760 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=60267da6d9ef2e3a59f484d9c33b23c76f6b41e9;p=platform%2Fupstream%2Fv8.git MIPS: Cleanup handling of shifts: SHR can deoptimize only when its a shift by 0, all other shift never deoptimize. Port r12373 (9fdde2ad) Original commit message: Fix DoDeferredNumberTagU to keep the value in xmm1 instead of xmm0 on x64. xmm0 is not saved across runtime call on x64 because MacroAssembler::EnterExitFrameEpilogue preserves only allocatable XMM registers unlike on ia32 where it preserves all registers. Cleanup handling of shifts: SHR can deoptimize only when its a shift by 0, all other shift never deoptimize. Fix type inference for i-to-t change instruction. On X64 this ensures that write-barrier is generated correctly. BUG= TEST= Review URL: https://chromiumcodereview.appspot.com/10876054 Patch from Akos Palfi . git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@12831 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/mips/lithium-mips.cc b/src/mips/lithium-mips.cc index 0b6dcae..034700e 100644 --- a/src/mips/lithium-mips.cc +++ b/src/mips/lithium-mips.cc @@ -702,15 +702,13 @@ LInstruction* LChunkBuilder::DoShift(Token::Value op, right = UseRegisterAtStart(right_value); } + // Shift operations can only deoptimize if we do a logical shift + // by 0 and the result cannot be truncated to int32. bool does_deopt = false; - - if (FLAG_opt_safe_uint32_operations) { - does_deopt = !instr->CheckFlag(HInstruction::kUint32); - } else { - // Shift operations can only deoptimize if we do a logical shift - // by 0 and the result cannot be truncated to int32. - bool may_deopt = (op == Token::SHR && constant_value == 0); - if (may_deopt) { + if (op == Token::SHR && constant_value == 0) { + if (FLAG_opt_safe_uint32_operations) { + does_deopt = !instr->CheckFlag(HInstruction::kUint32); + } else { for (HUseIterator it(instr->uses()); !it.Done(); it.Advance()) { if (!it.value()->CheckFlag(HValue::kTruncatingToInt32)) { does_deopt = true;