From ea14c000bc4c5cbadd62f18af7986e89fad68f09 Mon Sep 17 00:00:00 2001 From: "verwaest@chromium.org" Date: Wed, 14 Aug 2013 15:50:23 +0000 Subject: [PATCH] Fix CmpHoleAndBranch on no-sse2 R=danno@chromium.org Review URL: https://chromiumcodereview.appspot.com/22810005 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16192 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/ia32/lithium-codegen-ia32.cc | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc index 97c20e7..5513733 100644 --- a/src/ia32/lithium-codegen-ia32.cc +++ b/src/ia32/lithium-codegen-ia32.cc @@ -2236,7 +2236,11 @@ void LCodeGen::EmitBranch(InstrType instr, Condition cc) { template void LCodeGen::EmitFalseBranch(InstrType instr, Condition cc) { int false_block = instr->FalseDestination(chunk_); - __ j(cc, chunk_->GetAssemblyLabel(false_block)); + if (cc == no_condition) { + __ jmp(chunk_->GetAssemblyLabel(false_block)); + } else { + __ j(cc, chunk_->GetAssemblyLabel(false_block)); + } } @@ -2503,6 +2507,7 @@ void LCodeGen::DoCmpHoleAndBranch(LCmpHoleAndBranch* instr) { CpuFeatureScope scope(masm(), SSE2); XMMRegister input_reg = ToDoubleRegister(instr->object()); __ ucomisd(input_reg, input_reg); + EmitFalseBranch(instr, parity_odd); } else { // Put the value to the top of stack X87Register src = ToX87Register(instr->object()); @@ -2510,9 +2515,13 @@ void LCodeGen::DoCmpHoleAndBranch(LCmpHoleAndBranch* instr) { __ fld(0); __ fld(0); __ FCmp(); + Label ok; + __ j(parity_even, &ok); + __ fstp(0); + EmitFalseBranch(instr, no_condition); + __ bind(&ok); } - EmitFalseBranch(instr, parity_odd); __ sub(esp, Immediate(kDoubleSize)); if (use_sse2) { @@ -2520,7 +2529,6 @@ void LCodeGen::DoCmpHoleAndBranch(LCmpHoleAndBranch* instr) { XMMRegister input_reg = ToDoubleRegister(instr->object()); __ movdbl(MemOperand(esp, 0), input_reg); } else { - __ fld(0); __ fstp_d(MemOperand(esp, 0)); } -- 2.7.4