Commit a450b746 authored by plind44@gmail.com's avatar plind44@gmail.com

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=
R=mvstanton@chromium.org

Review URL: https://codereview.chromium.org/189143006

Patch from Balazs Kilvady <kilvadyb@homejinni.com>.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@19726 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 9bb39d0a
......@@ -163,10 +163,9 @@ void Builtins::Generate_ArrayCode(MacroAssembler* masm) {
// 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 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
__ 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 {
......
......@@ -3162,9 +3162,9 @@ static void GenerateRecordCallTarget(MacroAssembler* masm) {
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 @@ static void GenerateRecordCallTarget(MacroAssembler* masm) {
// 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 @@ static void GenerateRecordCallTarget(MacroAssembler* masm) {
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 @@ void CallFunctionStub::Generate(MacroAssembler* masm) {
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 @@ void ArrayConstructorStub::Generate(MacroAssembler* masm) {
// ----------- 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 @@ void ArrayConstructorStub::Generate(MacroAssembler* masm) {
__ 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 @@ void ArrayConstructorStub::Generate(MacroAssembler* masm) {
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));
......
......@@ -3883,8 +3883,9 @@ void LCodeGen::DoCallNew(LCallNew* instr) {
__ 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 @@ void LCodeGen::DoCallNewArray(LCallNewArray* instr) {
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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment