From: palfia@homejinni.com Date: Wed, 24 Apr 2013 23:10:53 +0000 (+0000) Subject: MIPS: Add monomorphic CompareNilICs and Crankshaft support X-Git-Tag: upstream/4.7.83~14443 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6dc29db6552196803c64cc8806cd52b5aba56507;p=platform%2Fupstream%2Fv8.git MIPS: Add monomorphic CompareNilICs and Crankshaft support Port r14407 (cae6596b) BUG= Review URL: https://codereview.chromium.org/13840006 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@14427 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/mips/code-stubs-mips.cc b/src/mips/code-stubs-mips.cc index cc1cf4e..93a40be 100644 --- a/src/mips/code-stubs-mips.cc +++ b/src/mips/code-stubs-mips.cc @@ -97,6 +97,19 @@ void TransitionElementsKindStub::InitializeInterfaceDescriptor( } +void CompareNilICStub::InitializeInterfaceDescriptor( + Isolate* isolate, + CodeStubInterfaceDescriptor* descriptor) { + static Register registers[] = { a0 }; + descriptor->register_param_count_ = 1; + descriptor->register_params_ = registers; + descriptor->deoptimization_handler_ = + FUNCTION_ADDR(CompareNilIC_Miss); + descriptor->miss_handler_ = + ExternalReference(IC_Utility(IC::kCompareNilIC_Miss), isolate); +} + + static void InitializeArrayConstructorDescriptor(Isolate* isolate, CodeStubInterfaceDescriptor* descriptor) { // register state diff --git a/src/mips/full-codegen-mips.cc b/src/mips/full-codegen-mips.cc index 884b62a..bf0d931 100644 --- a/src/mips/full-codegen-mips.cc +++ b/src/mips/full-codegen-mips.cc @@ -4452,26 +4452,21 @@ void FullCodeGenerator::EmitLiteralCompareNil(CompareOperation* expr, VisitForAccumulatorValue(sub_expr); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false); - Heap::RootListIndex nil_value = nil == kNullValue ? - Heap::kNullValueRootIndex : - Heap::kUndefinedValueRootIndex; + EqualityKind kind = expr->op() == Token::EQ_STRICT + ? kStrictEquality : kNonStrictEquality; __ mov(a0, result_register()); - __ LoadRoot(a1, nil_value); - if (expr->op() == Token::EQ_STRICT) { + if (kind == kStrictEquality) { + Heap::RootListIndex nil_value = nil == kNullValue ? + Heap::kNullValueRootIndex : + Heap::kUndefinedValueRootIndex; + __ LoadRoot(a1, nil_value); Split(eq, a0, Operand(a1), if_true, if_false, fall_through); } else { - Heap::RootListIndex other_nil_value = nil == kNullValue ? - Heap::kUndefinedValueRootIndex : - Heap::kNullValueRootIndex; - __ Branch(if_true, eq, a0, Operand(a1)); - __ LoadRoot(a1, other_nil_value); - __ Branch(if_true, eq, a0, Operand(a1)); - __ JumpIfSmi(a0, if_false); - // It can be an undetectable object. - __ lw(a1, FieldMemOperand(a0, HeapObject::kMapOffset)); - __ lbu(a1, FieldMemOperand(a1, Map::kBitFieldOffset)); - __ And(a1, a1, Operand(1 << Map::kIsUndetectable)); - Split(ne, a1, Operand(zero_reg), if_true, if_false, fall_through); + Handle ic = CompareNilICStub::GetUninitialized(isolate(), + kNonStrictEquality, + nil); + CallIC(ic, RelocInfo::CODE_TARGET, expr->CompareOperationFeedbackId()); + Split(ne, v0, Operand(zero_reg), if_true, if_false, fall_through); } context()->Plug(if_true, if_false); }