Revision: 19726
Author: [email protected]
Date: Fri Mar 7 15:48:50 2014 UTC
Log: MIPS: Symbols for type cells.
Port r19706 (81fd8dd)
Original commit message:
We can make more efficient code to check against type cells in the future
if we use symbols, guaranteed not to conflict with user code. Currently,
the "symbols" are the hole and undefined. Undefined may come in from the
outside.
BUG=
[email protected]
Review URL: https://codereview.chromium.org/189143006
Patch from Balazs Kilvady <[email protected]>.
http://code.google.com/p/v8/source/detail?r=19726
Modified:
/branches/bleeding_edge/src/mips/builtins-mips.cc
/branches/bleeding_edge/src/mips/code-stubs-mips.cc
/branches/bleeding_edge/src/mips/lithium-codegen-mips.cc
=======================================
--- /branches/bleeding_edge/src/mips/builtins-mips.cc Tue Feb 4 00:06:44
2014 UTC
+++ /branches/bleeding_edge/src/mips/builtins-mips.cc Fri Mar 7 15:48:50
2014 UTC
@@ -163,10 +163,9 @@
// Run the native code for the Array function called as a normal
function.
// Tail call a stub.
- Handle<Object> undefined_sentinel(
- masm->isolate()->heap()->undefined_value(),
- masm->isolate());
- __ li(a2, Operand(undefined_sentinel));
+ Handle<Object> megamorphic_sentinel =
+ TypeFeedbackInfo::MegamorphicSentinel(masm->isolate());
+ __ li(a2, Operand(megamorphic_sentinel));
ArrayConstructorStub stub(masm->isolate());
__ TailCallStub(&stub);
}
@@ -757,9 +756,9 @@
__ mov(a0, a3);
if (is_construct) {
// No type feedback cell is available
- Handle<Object> undefined_sentinel(
- masm->isolate()->heap()->undefined_value(), masm->isolate());
- __ li(a2, Operand(undefined_sentinel));
+ Handle<Object> megamorphic_sentinel =
+ TypeFeedbackInfo::MegamorphicSentinel(masm->isolate());
+ __ li(a2, Operand(megamorphic_sentinel));
CallConstructStub stub(NO_CALL_FUNCTION_FLAGS);
__ CallStub(&stub);
} else {
=======================================
--- /branches/bleeding_edge/src/mips/code-stubs-mips.cc Mon Mar 3 13:27:59
2014 UTC
+++ /branches/bleeding_edge/src/mips/code-stubs-mips.cc Fri Mar 7 15:48:50
2014 UTC
@@ -3162,9 +3162,9 @@
Label initialize, done, miss, megamorphic, not_array_function;
ASSERT_EQ(*TypeFeedbackInfo::MegamorphicSentinel(masm->isolate()),
- masm->isolate()->heap()->undefined_value());
+ masm->isolate()->heap()->megamorphic_symbol());
ASSERT_EQ(*TypeFeedbackInfo::UninitializedSentinel(masm->isolate()),
- masm->isolate()->heap()->the_hole_value());
+ masm->isolate()->heap()->uninitialized_symbol());
// Load the cache state into t0.
__ sll(t0, a3, kPointerSizeLog2 - kSmiTagSize);
@@ -3192,14 +3192,14 @@
// A monomorphic miss (i.e, here the cache is not uninitialized) goes
// megamorphic.
- __ LoadRoot(at, Heap::kTheHoleValueRootIndex);
+ __ LoadRoot(at, Heap::kUninitializedSymbolRootIndex);
__ Branch(&initialize, eq, t0, Operand(at));
// MegamorphicSentinel is an immortal immovable object (undefined) so no
// write-barrier is needed.
__ bind(&megamorphic);
__ sll(t0, a3, kPointerSizeLog2 - kSmiTagSize);
__ Addu(t0, a2, Operand(t0));
- __ LoadRoot(at, Heap::kUndefinedValueRootIndex);
+ __ LoadRoot(at, Heap::kMegamorphicSymbolRootIndex);
__ sw(at, FieldMemOperand(t0, FixedArray::kHeaderSize));
__ jmp(&done);
@@ -3251,7 +3251,8 @@
void CallFunctionStub::Generate(MacroAssembler* masm) {
// a1 : the function to call
// a2 : feedback vector
- // a3 : (only if a2 is not undefined) slot in feedback vector (Smi)
+ // a3 : (only if a2 is not the megamorphic symbol) slot in feedback
+ // vector (Smi)
Label slow, non_function, wrap, cont;
if (NeedsChecks()) {
@@ -3305,12 +3306,12 @@
if (RecordCallTarget()) {
// If there is a call target cache, mark it megamorphic in the
// non-function case. MegamorphicSentinel is an immortal immovable
- // object (undefined) so no write barrier is needed.
+ // object (megamorphic symbol) so no write barrier is needed.
ASSERT_EQ(*TypeFeedbackInfo::MegamorphicSentinel(masm->isolate()),
- masm->isolate()->heap()->undefined_value());
+ masm->isolate()->heap()->megamorphic_symbol());
__ sll(t1, a3, kPointerSizeLog2 - kSmiTagSize);
__ Addu(t1, a2, Operand(t1));
- __ LoadRoot(at, Heap::kUndefinedValueRootIndex);
+ __ LoadRoot(at, Heap::kMegamorphicSymbolRootIndex);
__ sw(at, FieldMemOperand(t1, FixedArray::kHeaderSize));
}
// Check for function proxy.
@@ -5478,11 +5479,15 @@
// ----------- S t a t e -------------
// -- a0 : argc (only if argument_count_ == ANY)
// -- a1 : constructor
- // -- a2 : feedback vector (fixed array or undefined)
+ // -- a2 : feedback vector (fixed array or megamorphic symbol)
// -- a3 : slot index (if a2 is fixed array)
// -- sp[0] : return address
// -- sp[4] : last argument
// -----------------------------------
+
+ ASSERT_EQ(*TypeFeedbackInfo::MegamorphicSentinel(masm->isolate()),
+ masm->isolate()->heap()->megamorphic_symbol());
+
if (FLAG_debug_code) {
// The array construct code is only set for the global and natives
// builtin Array functions which always have maps.
@@ -5497,10 +5502,11 @@
__ Assert(eq, kUnexpectedInitialMapForArrayFunction,
t1, Operand(MAP_TYPE));
- // We should either have undefined in a2 or a valid fixed array.
+ // We should either have the megamorphic symbol in a2 or a valid
+ // fixed array.
Label okay_here;
Handle<Map> fixed_array_map =
masm->isolate()->factory()->fixed_array_map();
- __ LoadRoot(at, Heap::kUndefinedValueRootIndex);
+ __ LoadRoot(at, Heap::kMegamorphicSymbolRootIndex);
__ Branch(&okay_here, eq, a2, Operand(at));
__ lw(t0, FieldMemOperand(a2, 0));
__ Assert(eq, kExpectedFixedArrayInRegisterA2,
@@ -5514,7 +5520,7 @@
Label no_info;
// Get the elements kind and case on that.
- __ LoadRoot(at, Heap::kUndefinedValueRootIndex);
+ __ LoadRoot(at, Heap::kMegamorphicSymbolRootIndex);
__ Branch(&no_info, eq, a2, Operand(at));
__ sll(t0, a3, kPointerSizeLog2 - kSmiTagSize);
__ Addu(a2, a2, Operand(t0));
=======================================
--- /branches/bleeding_edge/src/mips/lithium-codegen-mips.cc Thu Mar 6
13:07:51 2014 UTC
+++ /branches/bleeding_edge/src/mips/lithium-codegen-mips.cc Fri Mar 7
15:48:50 2014 UTC
@@ -3883,8 +3883,9 @@
__ li(a0, Operand(instr->arity()));
// No cell in a2 for construct type feedback in optimized code
- Handle<Object> undefined_value(isolate()->factory()->undefined_value());
- __ li(a2, Operand(undefined_value));
+ Handle<Object> megamorphic_symbol =
+ TypeFeedbackInfo::MegamorphicSentinel(isolate());
+ __ li(a2, Operand(megamorphic_symbol));
CallConstructStub stub(NO_CALL_FUNCTION_FLAGS);
CallCode(stub.GetCode(isolate()), RelocInfo::CONSTRUCT_CALL, instr);
}
@@ -3896,7 +3897,7 @@
ASSERT(ToRegister(instr->result()).is(v0));
__ li(a0, Operand(instr->arity()));
- __ li(a2, Operand(factory()->undefined_value()));
+ __ li(a2, Operand(TypeFeedbackInfo::MegamorphicSentinel(isolate())));
ElementsKind kind = instr->hydrogen()->elements_kind();
AllocationSiteOverrideMode override_mode =
(AllocationSite::GetMode(kind) == TRACK_ALLOCATION_SITE)
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.