| OLD | NEW | 
|---|
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "src/crankshaft/ppc/lithium-codegen-ppc.h" | 5 #include "src/crankshaft/ppc/lithium-codegen-ppc.h" | 
| 6 | 6 | 
| 7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" | 
| 8 #include "src/code-factory.h" | 8 #include "src/code-factory.h" | 
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" | 
| 10 #include "src/crankshaft/hydrogen-osr.h" | 10 #include "src/crankshaft/hydrogen-osr.h" | 
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 168   // Possibly allocate a local context. | 168   // Possibly allocate a local context. | 
| 169   if (info()->scope()->num_heap_slots() > 0) { | 169   if (info()->scope()->num_heap_slots() > 0) { | 
| 170     Comment(";;; Allocate local context"); | 170     Comment(";;; Allocate local context"); | 
| 171     bool need_write_barrier = true; | 171     bool need_write_barrier = true; | 
| 172     // Argument to NewContext is the function, which is in r4. | 172     // Argument to NewContext is the function, which is in r4. | 
| 173     int slots = info()->scope()->num_heap_slots() - Context::MIN_CONTEXT_SLOTS; | 173     int slots = info()->scope()->num_heap_slots() - Context::MIN_CONTEXT_SLOTS; | 
| 174     Safepoint::DeoptMode deopt_mode = Safepoint::kNoLazyDeopt; | 174     Safepoint::DeoptMode deopt_mode = Safepoint::kNoLazyDeopt; | 
| 175     if (info()->scope()->is_script_scope()) { | 175     if (info()->scope()->is_script_scope()) { | 
| 176       __ push(r4); | 176       __ push(r4); | 
| 177       __ Push(info()->scope()->GetScopeInfo(info()->isolate())); | 177       __ Push(info()->scope()->GetScopeInfo(info()->isolate())); | 
| 178       __ CallRuntime(Runtime::kNewScriptContext, 2); | 178       __ CallRuntime(Runtime::kNewScriptContext); | 
| 179       deopt_mode = Safepoint::kLazyDeopt; | 179       deopt_mode = Safepoint::kLazyDeopt; | 
| 180     } else if (slots <= FastNewContextStub::kMaximumSlots) { | 180     } else if (slots <= FastNewContextStub::kMaximumSlots) { | 
| 181       FastNewContextStub stub(isolate(), slots); | 181       FastNewContextStub stub(isolate(), slots); | 
| 182       __ CallStub(&stub); | 182       __ CallStub(&stub); | 
| 183       // Result of FastNewContextStub is always in new space. | 183       // Result of FastNewContextStub is always in new space. | 
| 184       need_write_barrier = false; | 184       need_write_barrier = false; | 
| 185     } else { | 185     } else { | 
| 186       __ push(r4); | 186       __ push(r4); | 
| 187       __ CallRuntime(Runtime::kNewFunctionContext, 1); | 187       __ CallRuntime(Runtime::kNewFunctionContext); | 
| 188     } | 188     } | 
| 189     RecordSafepoint(deopt_mode); | 189     RecordSafepoint(deopt_mode); | 
| 190 | 190 | 
| 191     // Context is returned in both r3 and cp.  It replaces the context | 191     // Context is returned in both r3 and cp.  It replaces the context | 
| 192     // passed to us.  It's saved in the stack and kept live in cp. | 192     // passed to us.  It's saved in the stack and kept live in cp. | 
| 193     __ mr(cp, r3); | 193     __ mr(cp, r3); | 
| 194     __ StoreP(r3, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 194     __ StoreP(r3, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 
| 195     // Copy any necessary parameters into the context. | 195     // Copy any necessary parameters into the context. | 
| 196     int num_parameters = scope()->num_parameters(); | 196     int num_parameters = scope()->num_parameters(); | 
| 197     int first_parameter = scope()->has_this_declaration() ? -1 : 0; | 197     int first_parameter = scope()->has_this_declaration() ? -1 : 0; | 
| (...skipping 2553 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2751 | 2751 | 
| 2752 | 2752 | 
| 2753 void LCodeGen::DoReturn(LReturn* instr) { | 2753 void LCodeGen::DoReturn(LReturn* instr) { | 
| 2754   if (FLAG_trace && info()->IsOptimizing()) { | 2754   if (FLAG_trace && info()->IsOptimizing()) { | 
| 2755     // Push the return value on the stack as the parameter. | 2755     // Push the return value on the stack as the parameter. | 
| 2756     // Runtime::TraceExit returns its parameter in r3.  We're leaving the code | 2756     // Runtime::TraceExit returns its parameter in r3.  We're leaving the code | 
| 2757     // managed by the register allocator and tearing down the frame, it's | 2757     // managed by the register allocator and tearing down the frame, it's | 
| 2758     // safe to write to the context register. | 2758     // safe to write to the context register. | 
| 2759     __ push(r3); | 2759     __ push(r3); | 
| 2760     __ LoadP(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 2760     __ LoadP(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 
| 2761     __ CallRuntime(Runtime::kTraceExit, 1); | 2761     __ CallRuntime(Runtime::kTraceExit); | 
| 2762   } | 2762   } | 
| 2763   if (info()->saves_caller_doubles()) { | 2763   if (info()->saves_caller_doubles()) { | 
| 2764     RestoreCallerDoubles(); | 2764     RestoreCallerDoubles(); | 
| 2765   } | 2765   } | 
| 2766   if (instr->has_constant_parameter_count()) { | 2766   if (instr->has_constant_parameter_count()) { | 
| 2767     int parameter_count = ToInteger32(instr->constant_parameter_count()); | 2767     int parameter_count = ToInteger32(instr->constant_parameter_count()); | 
| 2768     int32_t sp_delta = (parameter_count + 1) * kPointerSize; | 2768     int32_t sp_delta = (parameter_count + 1) * kPointerSize; | 
| 2769     if (NeedsEagerFrame()) { | 2769     if (NeedsEagerFrame()) { | 
| 2770       masm_->LeaveFrame(StackFrame::JAVA_SCRIPT, sp_delta); | 2770       masm_->LeaveFrame(StackFrame::JAVA_SCRIPT, sp_delta); | 
| 2771     } else if (sp_delta != 0) { | 2771     } else if (sp_delta != 0) { | 
| (...skipping 728 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3500   } | 3500   } | 
| 3501 } | 3501 } | 
| 3502 | 3502 | 
| 3503 | 3503 | 
| 3504 void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) { | 3504 void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) { | 
| 3505   DCHECK(ToRegister(instr->context()).is(cp)); | 3505   DCHECK(ToRegister(instr->context()).is(cp)); | 
| 3506   __ Move(scratch0(), instr->hydrogen()->pairs()); | 3506   __ Move(scratch0(), instr->hydrogen()->pairs()); | 
| 3507   __ push(scratch0()); | 3507   __ push(scratch0()); | 
| 3508   __ LoadSmiLiteral(scratch0(), Smi::FromInt(instr->hydrogen()->flags())); | 3508   __ LoadSmiLiteral(scratch0(), Smi::FromInt(instr->hydrogen()->flags())); | 
| 3509   __ push(scratch0()); | 3509   __ push(scratch0()); | 
| 3510   CallRuntime(Runtime::kDeclareGlobals, 2, instr); | 3510   CallRuntime(Runtime::kDeclareGlobals, instr); | 
| 3511 } | 3511 } | 
| 3512 | 3512 | 
| 3513 | 3513 | 
| 3514 void LCodeGen::CallKnownFunction(Handle<JSFunction> function, | 3514 void LCodeGen::CallKnownFunction(Handle<JSFunction> function, | 
| 3515                                  int formal_parameter_count, int arity, | 3515                                  int formal_parameter_count, int arity, | 
| 3516                                  LInstruction* instr) { | 3516                                  LInstruction* instr) { | 
| 3517   bool dont_adapt_arguments = | 3517   bool dont_adapt_arguments = | 
| 3518       formal_parameter_count == SharedFunctionInfo::kDontAdaptArgumentsSentinel; | 3518       formal_parameter_count == SharedFunctionInfo::kDontAdaptArgumentsSentinel; | 
| 3519   bool can_invoke_directly = | 3519   bool can_invoke_directly = | 
| 3520       dont_adapt_arguments || formal_parameter_count == arity; | 3520       dont_adapt_arguments || formal_parameter_count == arity; | 
| (...skipping 2252 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5773   Register null_value = r8; | 5773   Register null_value = r8; | 
| 5774   __ LoadRoot(null_value, Heap::kNullValueRootIndex); | 5774   __ LoadRoot(null_value, Heap::kNullValueRootIndex); | 
| 5775   __ CheckEnumCache(null_value, &call_runtime); | 5775   __ CheckEnumCache(null_value, &call_runtime); | 
| 5776 | 5776 | 
| 5777   __ LoadP(r3, FieldMemOperand(r3, HeapObject::kMapOffset)); | 5777   __ LoadP(r3, FieldMemOperand(r3, HeapObject::kMapOffset)); | 
| 5778   __ b(&use_cache); | 5778   __ b(&use_cache); | 
| 5779 | 5779 | 
| 5780   // Get the set of properties to enumerate. | 5780   // Get the set of properties to enumerate. | 
| 5781   __ bind(&call_runtime); | 5781   __ bind(&call_runtime); | 
| 5782   __ push(r3); | 5782   __ push(r3); | 
| 5783   CallRuntime(Runtime::kGetPropertyNamesFast, 1, instr); | 5783   CallRuntime(Runtime::kGetPropertyNamesFast, instr); | 
| 5784 | 5784 | 
| 5785   __ LoadP(r4, FieldMemOperand(r3, HeapObject::kMapOffset)); | 5785   __ LoadP(r4, FieldMemOperand(r3, HeapObject::kMapOffset)); | 
| 5786   __ LoadRoot(ip, Heap::kMetaMapRootIndex); | 5786   __ LoadRoot(ip, Heap::kMetaMapRootIndex); | 
| 5787   __ cmp(r4, ip); | 5787   __ cmp(r4, ip); | 
| 5788   DeoptimizeIf(ne, instr, Deoptimizer::kWrongMap); | 5788   DeoptimizeIf(ne, instr, Deoptimizer::kWrongMap); | 
| 5789   __ bind(&use_cache); | 5789   __ bind(&use_cache); | 
| 5790 } | 5790 } | 
| 5791 | 5791 | 
| 5792 | 5792 | 
| 5793 void LCodeGen::DoForInCacheArray(LForInCacheArray* instr) { | 5793 void LCodeGen::DoForInCacheArray(LForInCacheArray* instr) { | 
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5894 void LCodeGen::DoStoreFrameContext(LStoreFrameContext* instr) { | 5894 void LCodeGen::DoStoreFrameContext(LStoreFrameContext* instr) { | 
| 5895   Register context = ToRegister(instr->context()); | 5895   Register context = ToRegister(instr->context()); | 
| 5896   __ StoreP(context, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 5896   __ StoreP(context, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 
| 5897 } | 5897 } | 
| 5898 | 5898 | 
| 5899 | 5899 | 
| 5900 void LCodeGen::DoAllocateBlockContext(LAllocateBlockContext* instr) { | 5900 void LCodeGen::DoAllocateBlockContext(LAllocateBlockContext* instr) { | 
| 5901   Handle<ScopeInfo> scope_info = instr->scope_info(); | 5901   Handle<ScopeInfo> scope_info = instr->scope_info(); | 
| 5902   __ Push(scope_info); | 5902   __ Push(scope_info); | 
| 5903   __ push(ToRegister(instr->function())); | 5903   __ push(ToRegister(instr->function())); | 
| 5904   CallRuntime(Runtime::kPushBlockContext, 2, instr); | 5904   CallRuntime(Runtime::kPushBlockContext, instr); | 
| 5905   RecordSafepoint(Safepoint::kNoLazyDeopt); | 5905   RecordSafepoint(Safepoint::kNoLazyDeopt); | 
| 5906 } | 5906 } | 
| 5907 | 5907 | 
| 5908 | 5908 | 
| 5909 #undef __ | 5909 #undef __ | 
| 5910 }  // namespace internal | 5910 }  // namespace internal | 
| 5911 }  // namespace v8 | 5911 }  // namespace v8 | 
| OLD | NEW | 
|---|