Index: src/ia32/lithium-codegen-ia32.cc |
diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc |
index 7753e1d37f362b29655a2513a89e91a608a6e991..29749ba2ebeb9e8577d3cd5805f70fb42ec42c04 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<class InstrType> |
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)); |
} |