Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(721)

Side by Side Diff: src/crankshaft/x87/lithium-codegen-x87.cc

Issue 1553703002: [runtime] TailCallRuntime and CallRuntime should use default argument counts (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@2015-12-29_TailCallRuntime_default_result_size_1_1550923002
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 #if V8_TARGET_ARCH_X87 5 #if V8_TARGET_ARCH_X87
6 6
7 #include "src/crankshaft/x87/lithium-codegen-x87.h" 7 #include "src/crankshaft/x87/lithium-codegen-x87.h"
8 8
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/code-factory.h" 10 #include "src/code-factory.h"
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 // Possibly allocate a local context. 209 // Possibly allocate a local context.
210 if (info_->num_heap_slots() > 0) { 210 if (info_->num_heap_slots() > 0) {
211 Comment(";;; Allocate local context"); 211 Comment(";;; Allocate local context");
212 bool need_write_barrier = true; 212 bool need_write_barrier = true;
213 // Argument to NewContext is the function, which is still in edi. 213 // Argument to NewContext is the function, which is still in edi.
214 int slots = info_->num_heap_slots() - Context::MIN_CONTEXT_SLOTS; 214 int slots = info_->num_heap_slots() - Context::MIN_CONTEXT_SLOTS;
215 Safepoint::DeoptMode deopt_mode = Safepoint::kNoLazyDeopt; 215 Safepoint::DeoptMode deopt_mode = Safepoint::kNoLazyDeopt;
216 if (info()->scope()->is_script_scope()) { 216 if (info()->scope()->is_script_scope()) {
217 __ push(edi); 217 __ push(edi);
218 __ Push(info()->scope()->GetScopeInfo(info()->isolate())); 218 __ Push(info()->scope()->GetScopeInfo(info()->isolate()));
219 __ CallRuntime(Runtime::kNewScriptContext, 2); 219 __ CallRuntime(Runtime::kNewScriptContext);
220 deopt_mode = Safepoint::kLazyDeopt; 220 deopt_mode = Safepoint::kLazyDeopt;
221 } else if (slots <= FastNewContextStub::kMaximumSlots) { 221 } else if (slots <= FastNewContextStub::kMaximumSlots) {
222 FastNewContextStub stub(isolate(), slots); 222 FastNewContextStub stub(isolate(), slots);
223 __ CallStub(&stub); 223 __ CallStub(&stub);
224 // Result of FastNewContextStub is always in new space. 224 // Result of FastNewContextStub is always in new space.
225 need_write_barrier = false; 225 need_write_barrier = false;
226 } else { 226 } else {
227 __ push(edi); 227 __ push(edi);
228 __ CallRuntime(Runtime::kNewFunctionContext, 1); 228 __ CallRuntime(Runtime::kNewFunctionContext);
229 } 229 }
230 RecordSafepoint(deopt_mode); 230 RecordSafepoint(deopt_mode);
231 231
232 // Context is returned in eax. It replaces the context passed to us. 232 // Context is returned in eax. It replaces the context passed to us.
233 // It's saved in the stack and kept live in esi. 233 // It's saved in the stack and kept live in esi.
234 __ mov(esi, eax); 234 __ mov(esi, eax);
235 __ mov(Operand(ebp, StandardFrameConstants::kContextOffset), eax); 235 __ mov(Operand(ebp, StandardFrameConstants::kContextOffset), eax);
236 236
237 // Copy parameters into context if necessary. 237 // Copy parameters into context if necessary.
238 int num_parameters = scope()->num_parameters(); 238 int num_parameters = scope()->num_parameters();
(...skipping 2646 matching lines...) Expand 10 before | Expand all | Expand 10 after
2885 2885
2886 2886
2887 void LCodeGen::DoReturn(LReturn* instr) { 2887 void LCodeGen::DoReturn(LReturn* instr) {
2888 if (FLAG_trace && info()->IsOptimizing()) { 2888 if (FLAG_trace && info()->IsOptimizing()) {
2889 // Preserve the return value on the stack and rely on the runtime call 2889 // Preserve the return value on the stack and rely on the runtime call
2890 // to return the value in the same register. We're leaving the code 2890 // to return the value in the same register. We're leaving the code
2891 // managed by the register allocator and tearing down the frame, it's 2891 // managed by the register allocator and tearing down the frame, it's
2892 // safe to write to the context register. 2892 // safe to write to the context register.
2893 __ push(eax); 2893 __ push(eax);
2894 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); 2894 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset));
2895 __ CallRuntime(Runtime::kTraceExit, 1); 2895 __ CallRuntime(Runtime::kTraceExit);
2896 } 2896 }
2897 if (dynamic_frame_alignment_) { 2897 if (dynamic_frame_alignment_) {
2898 // Fetch the state of the dynamic frame alignment. 2898 // Fetch the state of the dynamic frame alignment.
2899 __ mov(edx, Operand(ebp, 2899 __ mov(edx, Operand(ebp,
2900 JavaScriptFrameConstants::kDynamicAlignmentStateOffset)); 2900 JavaScriptFrameConstants::kDynamicAlignmentStateOffset));
2901 } 2901 }
2902 if (NeedsEagerFrame()) { 2902 if (NeedsEagerFrame()) {
2903 __ mov(esp, ebp); 2903 __ mov(esp, ebp);
2904 __ pop(ebp); 2904 __ pop(ebp);
2905 } 2905 }
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after
3473 // If there is no frame, the context must be in esi. 3473 // If there is no frame, the context must be in esi.
3474 DCHECK(result.is(esi)); 3474 DCHECK(result.is(esi));
3475 } 3475 }
3476 } 3476 }
3477 3477
3478 3478
3479 void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) { 3479 void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) {
3480 DCHECK(ToRegister(instr->context()).is(esi)); 3480 DCHECK(ToRegister(instr->context()).is(esi));
3481 __ push(Immediate(instr->hydrogen()->pairs())); 3481 __ push(Immediate(instr->hydrogen()->pairs()));
3482 __ push(Immediate(Smi::FromInt(instr->hydrogen()->flags()))); 3482 __ push(Immediate(Smi::FromInt(instr->hydrogen()->flags())));
3483 CallRuntime(Runtime::kDeclareGlobals, 2, instr); 3483 CallRuntime(Runtime::kDeclareGlobals, instr);
3484 } 3484 }
3485 3485
3486 3486
3487 void LCodeGen::CallKnownFunction(Handle<JSFunction> function, 3487 void LCodeGen::CallKnownFunction(Handle<JSFunction> function,
3488 int formal_parameter_count, int arity, 3488 int formal_parameter_count, int arity,
3489 LInstruction* instr) { 3489 LInstruction* instr) {
3490 bool dont_adapt_arguments = 3490 bool dont_adapt_arguments =
3491 formal_parameter_count == SharedFunctionInfo::kDontAdaptArgumentsSentinel; 3491 formal_parameter_count == SharedFunctionInfo::kDontAdaptArgumentsSentinel;
3492 bool can_invoke_directly = 3492 bool can_invoke_directly =
3493 dont_adapt_arguments || formal_parameter_count == arity; 3493 dont_adapt_arguments || formal_parameter_count == arity;
(...skipping 2434 matching lines...) Expand 10 before | Expand all | Expand 10 after
5928 5928
5929 Label use_cache, call_runtime; 5929 Label use_cache, call_runtime;
5930 __ CheckEnumCache(&call_runtime); 5930 __ CheckEnumCache(&call_runtime);
5931 5931
5932 __ mov(eax, FieldOperand(eax, HeapObject::kMapOffset)); 5932 __ mov(eax, FieldOperand(eax, HeapObject::kMapOffset));
5933 __ jmp(&use_cache, Label::kNear); 5933 __ jmp(&use_cache, Label::kNear);
5934 5934
5935 // Get the set of properties to enumerate. 5935 // Get the set of properties to enumerate.
5936 __ bind(&call_runtime); 5936 __ bind(&call_runtime);
5937 __ push(eax); 5937 __ push(eax);
5938 CallRuntime(Runtime::kGetPropertyNamesFast, 1, instr); 5938 CallRuntime(Runtime::kGetPropertyNamesFast, instr);
5939 5939
5940 __ cmp(FieldOperand(eax, HeapObject::kMapOffset), 5940 __ cmp(FieldOperand(eax, HeapObject::kMapOffset),
5941 isolate()->factory()->meta_map()); 5941 isolate()->factory()->meta_map());
5942 DeoptimizeIf(not_equal, instr, Deoptimizer::kWrongMap); 5942 DeoptimizeIf(not_equal, instr, Deoptimizer::kWrongMap);
5943 __ bind(&use_cache); 5943 __ bind(&use_cache);
5944 } 5944 }
5945 5945
5946 5946
5947 void LCodeGen::DoForInCacheArray(LForInCacheArray* instr) { 5947 void LCodeGen::DoForInCacheArray(LForInCacheArray* instr) {
5948 Register map = ToRegister(instr->map()); 5948 Register map = ToRegister(instr->map());
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
6049 void LCodeGen::DoStoreFrameContext(LStoreFrameContext* instr) { 6049 void LCodeGen::DoStoreFrameContext(LStoreFrameContext* instr) {
6050 Register context = ToRegister(instr->context()); 6050 Register context = ToRegister(instr->context());
6051 __ mov(Operand(ebp, StandardFrameConstants::kContextOffset), context); 6051 __ mov(Operand(ebp, StandardFrameConstants::kContextOffset), context);
6052 } 6052 }
6053 6053
6054 6054
6055 void LCodeGen::DoAllocateBlockContext(LAllocateBlockContext* instr) { 6055 void LCodeGen::DoAllocateBlockContext(LAllocateBlockContext* instr) {
6056 Handle<ScopeInfo> scope_info = instr->scope_info(); 6056 Handle<ScopeInfo> scope_info = instr->scope_info();
6057 __ Push(scope_info); 6057 __ Push(scope_info);
6058 __ push(ToRegister(instr->function())); 6058 __ push(ToRegister(instr->function()));
6059 CallRuntime(Runtime::kPushBlockContext, 2, instr); 6059 CallRuntime(Runtime::kPushBlockContext, instr);
6060 RecordSafepoint(Safepoint::kNoLazyDeopt); 6060 RecordSafepoint(Safepoint::kNoLazyDeopt);
6061 } 6061 }
6062 6062
6063 6063
6064 #undef __ 6064 #undef __
6065 6065
6066 } // namespace internal 6066 } // namespace internal
6067 } // namespace v8 6067 } // namespace v8
6068 6068
6069 #endif // V8_TARGET_ARCH_X87 6069 #endif // V8_TARGET_ARCH_X87
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698