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

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

Issue 1696043002: [runtime] Unify and simplify how frames are marked (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Tweaks Created 4 years, 10 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_IA32 5 #if V8_TARGET_ARCH_IA32
6 6
7 #include "src/crankshaft/ia32/lithium-codegen-ia32.h" 7 #include "src/crankshaft/ia32/lithium-codegen-ia32.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 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 __ mov(Operand(ebx, 0), Immediate(kAlignmentZapValue)); 155 __ mov(Operand(ebx, 0), Immediate(kAlignmentZapValue));
156 __ bind(&do_not_pad); 156 __ bind(&do_not_pad);
157 } 157 }
158 } 158 }
159 159
160 info()->set_prologue_offset(masm_->pc_offset()); 160 info()->set_prologue_offset(masm_->pc_offset());
161 if (NeedsEagerFrame()) { 161 if (NeedsEagerFrame()) {
162 DCHECK(!frame_is_built_); 162 DCHECK(!frame_is_built_);
163 frame_is_built_ = true; 163 frame_is_built_ = true;
164 if (info()->IsStub()) { 164 if (info()->IsStub()) {
165 __ StubPrologue(); 165 __ push(ebp); // Caller's frame pointer.
Benedikt Meurer 2016/02/22 18:16:39 Awesome!
danno 2016/03/07 09:33:38 Acknowledged.
166 __ mov(ebp, esp);
167 __ push(Immediate(Smi::FromInt(StackFrame::STUB)));
166 } else { 168 } else {
167 __ Prologue(info()->GeneratePreagedPrologue()); 169 __ Prologue(info()->GeneratePreagedPrologue());
168 } 170 }
169 } 171 }
170 172
171 if (info()->IsOptimizing() && 173 if (info()->IsOptimizing() &&
172 dynamic_frame_alignment_ && 174 dynamic_frame_alignment_ &&
173 FLAG_debug_code) { 175 FLAG_debug_code) {
174 __ test(esp, Immediate(kPointerSize)); 176 __ test(esp, Immediate(kPointerSize));
175 __ Assert(zero, kFrameIsExpectedToBeAligned); 177 __ Assert(zero, kFrameIsExpectedToBeAligned);
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 } else { 375 } else {
374 if (info()->saves_caller_doubles()) RestoreCallerDoubles(); 376 if (info()->saves_caller_doubles()) RestoreCallerDoubles();
375 __ call(entry, RelocInfo::RUNTIME_ENTRY); 377 __ call(entry, RelocInfo::RUNTIME_ENTRY);
376 } 378 }
377 info()->LogDeoptCallPosition(masm()->pc_offset(), 379 info()->LogDeoptCallPosition(masm()->pc_offset(),
378 table_entry->deopt_info.inlining_id); 380 table_entry->deopt_info.inlining_id);
379 } 381 }
380 if (needs_frame.is_linked()) { 382 if (needs_frame.is_linked()) {
381 __ bind(&needs_frame); 383 __ bind(&needs_frame);
382 /* stack layout 384 /* stack layout
383 4: entry address 385 3: entry address
384 3: return address <-- esp 386 2: return address <-- esp
385 2: garbage
386 1: garbage 387 1: garbage
387 0: garbage 388 0: garbage
388 */ 389 */
389 __ sub(esp, Immediate(kPointerSize)); // Reserve space for stub marker. 390 __ push(MemOperand(esp, 0)); // Copy return address.
390 __ push(MemOperand(esp, kPointerSize)); // Copy return address. 391 __ push(MemOperand(esp, 2 * kPointerSize)); // Copy entry address.
391 __ push(MemOperand(esp, 3 * kPointerSize)); // Copy entry address.
392 392
393 /* stack layout 393 /* stack layout
394 4: entry address 394 4: entry address
395 3: return address 395 3: return address
396 2: garbage
397 1: return address 396 1: return address
398 0: entry address <-- esp 397 0: entry address <-- esp
399 */ 398 */
400 __ mov(MemOperand(esp, 4 * kPointerSize), ebp); // Save ebp. 399 __ mov(MemOperand(esp, 3 * kPointerSize), ebp); // Save ebp.
400 // Fill ebp with the right stack frame address.
401 __ lea(ebp, MemOperand(esp, 3 * kPointerSize));
401 // Copy context. 402 // Copy context.
402 __ mov(ebp, MemOperand(ebp, StandardFrameConstants::kContextOffset));
403 __ mov(MemOperand(esp, 3 * kPointerSize), ebp);
404 // Fill ebp with the right stack frame address.
405 __ lea(ebp, MemOperand(esp, 4 * kPointerSize));
406 // This variant of deopt can only be used with stubs. Since we don't 403 // This variant of deopt can only be used with stubs. Since we don't
407 // have a function pointer to install in the stack frame that we're 404 // have a function pointer to install in the stack frame that we're
408 // building, install a special marker there instead. 405 // building, install a special marker there instead.
409 DCHECK(info()->IsStub()); 406 DCHECK(info()->IsStub());
410 __ mov(MemOperand(esp, 2 * kPointerSize), 407 __ mov(MemOperand(esp, 2 * kPointerSize),
411 Immediate(Smi::FromInt(StackFrame::STUB))); 408 Immediate(Smi::FromInt(StackFrame::STUB)));
412 409
413 /* stack layout 410 /* stack layout
414 4: old ebp 411 3: old ebp
415 3: context pointer
416 2: stub marker 412 2: stub marker
417 1: return address 413 1: return address
418 0: entry address <-- esp 414 0: entry address <-- esp
419 */ 415 */
420 __ ret(0); // Call the continuation without clobbering registers. 416 __ ret(0); // Call the continuation without clobbering registers.
421 } 417 }
422 return !is_aborted(); 418 return !is_aborted();
423 } 419 }
424 420
425 421
(...skipping 14 matching lines...) Expand all
440 code->instr()->hydrogen_value()->id(), 436 code->instr()->hydrogen_value()->id(),
441 code->instr()->Mnemonic()); 437 code->instr()->Mnemonic());
442 __ bind(code->entry()); 438 __ bind(code->entry());
443 if (NeedsDeferredFrame()) { 439 if (NeedsDeferredFrame()) {
444 Comment(";;; Build frame"); 440 Comment(";;; Build frame");
445 DCHECK(!frame_is_built_); 441 DCHECK(!frame_is_built_);
446 DCHECK(info()->IsStub()); 442 DCHECK(info()->IsStub());
447 frame_is_built_ = true; 443 frame_is_built_ = true;
448 // Build the frame in such a way that esi isn't trashed. 444 // Build the frame in such a way that esi isn't trashed.
449 __ push(ebp); // Caller's frame pointer. 445 __ push(ebp); // Caller's frame pointer.
450 __ push(Operand(ebp, StandardFrameConstants::kContextOffset));
451 __ push(Immediate(Smi::FromInt(StackFrame::STUB))); 446 __ push(Immediate(Smi::FromInt(StackFrame::STUB)));
452 __ lea(ebp, Operand(esp, 2 * kPointerSize)); 447 __ lea(ebp, Operand(esp, 1 * kPointerSize));
453 Comment(";;; Deferred code"); 448 Comment(";;; Deferred code");
454 } 449 }
455 code->Generate(); 450 code->Generate();
456 if (NeedsDeferredFrame()) { 451 if (NeedsDeferredFrame()) {
457 __ bind(code->done()); 452 __ bind(code->done());
458 Comment(";;; Destroy frame"); 453 Comment(";;; Destroy frame");
459 DCHECK(frame_is_built_); 454 DCHECK(frame_is_built_);
460 frame_is_built_ = false; 455 frame_is_built_ = false;
461 __ mov(esp, ebp); 456 __ mov(esp, ebp);
462 __ pop(ebp); 457 __ pop(ebp);
(...skipping 2475 matching lines...) Expand 10 before | Expand all | Expand 10 after
2938 2933
2939 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) { 2934 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) {
2940 Register result = ToRegister(instr->result()); 2935 Register result = ToRegister(instr->result());
2941 2936
2942 if (instr->hydrogen()->from_inlined()) { 2937 if (instr->hydrogen()->from_inlined()) {
2943 __ lea(result, Operand(esp, -2 * kPointerSize)); 2938 __ lea(result, Operand(esp, -2 * kPointerSize));
2944 } else { 2939 } else {
2945 // Check for arguments adapter frame. 2940 // Check for arguments adapter frame.
2946 Label done, adapted; 2941 Label done, adapted;
2947 __ mov(result, Operand(ebp, StandardFrameConstants::kCallerFPOffset)); 2942 __ mov(result, Operand(ebp, StandardFrameConstants::kCallerFPOffset));
2948 __ mov(result, Operand(result, StandardFrameConstants::kContextOffset)); 2943 __ mov(result,
2944 Operand(result, CommonFrameConstants::kContextOrFrameTypeOffset));
2949 __ cmp(Operand(result), 2945 __ cmp(Operand(result),
2950 Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); 2946 Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)));
2951 __ j(equal, &adapted, Label::kNear); 2947 __ j(equal, &adapted, Label::kNear);
2952 2948
2953 // No arguments adaptor frame. 2949 // No arguments adaptor frame.
2954 __ mov(result, Operand(ebp)); 2950 __ mov(result, Operand(ebp));
2955 __ jmp(&done, Label::kNear); 2951 __ jmp(&done, Label::kNear);
2956 2952
2957 // Arguments adaptor frame present. 2953 // Arguments adaptor frame present.
2958 __ bind(&adapted); 2954 __ bind(&adapted);
(...skipping 2428 matching lines...) Expand 10 before | Expand all | Expand 10 after
5387 __ mov(Operand(ebp, StandardFrameConstants::kContextOffset), context); 5383 __ mov(Operand(ebp, StandardFrameConstants::kContextOffset), context);
5388 } 5384 }
5389 5385
5390 5386
5391 #undef __ 5387 #undef __
5392 5388
5393 } // namespace internal 5389 } // namespace internal
5394 } // namespace v8 5390 } // namespace v8
5395 5391
5396 #endif // V8_TARGET_ARCH_IA32 5392 #endif // V8_TARGET_ARCH_IA32
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698