From: lrn@chromium.org Date: Fri, 7 May 2010 11:25:29 +0000 (+0000) Subject: Synchronizing Comparison codegen between X64 and ia32. X-Git-Tag: upstream/4.7.83~21847 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=876c3e06b5f4365b7d1a8bc4932bbcdc0f5d09cc;p=platform%2Fupstream%2Fv8.git Synchronizing Comparison codegen between X64 and ia32. Review URL: http://codereview.chromium.org/2010007 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4612 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/ia32/codegen-ia32.cc b/src/ia32/codegen-ia32.cc index 86e31bd..74a343b 100644 --- a/src/ia32/codegen-ia32.cc +++ b/src/ia32/codegen-ia32.cc @@ -2497,7 +2497,9 @@ void CodeGenerator::Comparison(AstNode* node, // by reconstituting them on the non-fall-through path. if (left_side.is_smi()) { - if (FLAG_debug_code) __ AbortIfNotSmi(left_side.reg()); + if (FLAG_debug_code) { + __ AbortIfNotSmi(left_side.reg()); + } } else { JumpTarget is_smi; __ test(left_side.reg(), Immediate(kSmiTagMask)); @@ -2526,7 +2528,7 @@ void CodeGenerator::Comparison(AstNode* node, __ cvtsi2sd(xmm0, Operand(temp.reg())); temp.Unuse(); } - __ comisd(xmm1, xmm0); + __ ucomisd(xmm1, xmm0); // Jump to builtin for NaN. not_number.Branch(parity_even, &left_side); left_side.Unuse(); @@ -2817,11 +2819,7 @@ void CodeGenerator::Comparison(AstNode* node, // number comparison in the stub if it was inlined. CompareStub stub(cc, strict, nan_info, !inline_number_compare); Result answer = frame_->CallStub(&stub, &left_side, &right_side); - if (cc == equal) { - __ test(answer.reg(), Operand(answer.reg())); - } else { - __ cmp(answer.reg(), 0); - } + __ test(answer.reg(), Operand(answer.reg())); answer.Unuse(); dest->true_target()->Branch(cc); dest->false_target()->Jump(); diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc index 2f21357..8511845 100644 --- a/src/x64/codegen-x64.cc +++ b/src/x64/codegen-x64.cc @@ -5739,48 +5739,55 @@ void CodeGenerator::Comparison(AstNode* node, // by reconstituting them on the non-fall-through path. JumpTarget is_smi; - Condition left_is_smi = masm_->CheckSmi(left_side.reg()); - is_smi.Branch(left_is_smi); - - bool is_loop_condition = (node->AsExpression() != NULL) && - node->AsExpression()->is_loop_condition(); - if (!is_loop_condition && right_val->IsSmi()) { - // Right side is a constant smi and left side has been checked - // not to be a smi. - JumpTarget not_number; - __ Cmp(FieldOperand(left_reg, HeapObject::kMapOffset), - Factory::heap_number_map()); - not_number.Branch(not_equal, &left_side); - __ movsd(xmm1, - FieldOperand(left_reg, HeapNumber::kValueOffset)); - int value = Smi::cast(*right_val)->value(); - if (value == 0) { - __ xorpd(xmm0, xmm0); - } else { - Result temp = allocator()->Allocate(); - __ movl(temp.reg(), Immediate(value)); - __ cvtlsi2sd(xmm0, temp.reg()); - temp.Unuse(); + if (left_side.is_smi()) { + if (FLAG_debug_code) { + __ AbortIfNotSmi(left_side.reg(), "Non-smi value inferred as smi."); + } + } else { + Condition left_is_smi = masm_->CheckSmi(left_side.reg()); + is_smi.Branch(left_is_smi); + + bool is_loop_condition = (node->AsExpression() != NULL) && + node->AsExpression()->is_loop_condition(); + if (!is_loop_condition && right_val->IsSmi()) { + // Right side is a constant smi and left side has been checked + // not to be a smi. + JumpTarget not_number; + __ Cmp(FieldOperand(left_reg, HeapObject::kMapOffset), + Factory::heap_number_map()); + not_number.Branch(not_equal, &left_side); + __ movsd(xmm1, + FieldOperand(left_reg, HeapNumber::kValueOffset)); + int value = Smi::cast(*right_val)->value(); + if (value == 0) { + __ xorpd(xmm0, xmm0); + } else { + Result temp = allocator()->Allocate(); + __ movl(temp.reg(), Immediate(value)); + __ cvtlsi2sd(xmm0, temp.reg()); + temp.Unuse(); + } + __ ucomisd(xmm1, xmm0); + // Jump to builtin for NaN. + not_number.Branch(parity_even, &left_side); + left_side.Unuse(); + dest->true_target()->Branch(DoubleCondition(cc)); + dest->false_target()->Jump(); + not_number.Bind(&left_side); } - __ ucomisd(xmm1, xmm0); - // Jump to builtin for NaN. - not_number.Branch(parity_even, &left_side); - left_side.Unuse(); - dest->true_target()->Branch(DoubleCondition(cc)); + + // Setup and call the compare stub. + CompareStub stub(cc, strict, kCantBothBeNaN); + Result result = frame_->CallStub(&stub, &left_side, &right_side); + result.ToRegister(); + __ testq(result.reg(), result.reg()); + result.Unuse(); + dest->true_target()->Branch(cc); dest->false_target()->Jump(); - not_number.Bind(&left_side); - } - // Setup and call the compare stub. - CompareStub stub(cc, strict, kCantBothBeNaN); - Result result = frame_->CallStub(&stub, &left_side, &right_side); - result.ToRegister(); - __ testq(result.reg(), result.reg()); - result.Unuse(); - dest->true_target()->Branch(cc); - dest->false_target()->Jump(); + is_smi.Bind(); + } - is_smi.Bind(); left_side = Result(left_reg); right_side = Result(right_val); // Test smi equality and comparison by signed int comparison. @@ -5952,7 +5959,7 @@ void CodeGenerator::Comparison(AstNode* node, // If the first character is the same then the long string sorts after // the short one. __ SmiCompare(FieldOperand(left_side.reg(), String::kLengthOffset), - Smi::FromInt(1)); + Smi::FromInt(1)); __ bind(&characters_were_different); } temp2.Unuse();