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

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: Fix merge problems Created 4 years, 9 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 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 123
124 if (info()->IsOptimizing()) { 124 if (info()->IsOptimizing()) {
125 ProfileEntryHookStub::MaybeCallEntryHook(masm_); 125 ProfileEntryHookStub::MaybeCallEntryHook(masm_);
126 } 126 }
127 127
128 info()->set_prologue_offset(masm_->pc_offset()); 128 info()->set_prologue_offset(masm_->pc_offset());
129 if (NeedsEagerFrame()) { 129 if (NeedsEagerFrame()) {
130 DCHECK(!frame_is_built_); 130 DCHECK(!frame_is_built_);
131 frame_is_built_ = true; 131 frame_is_built_ = true;
132 if (info()->IsStub()) { 132 if (info()->IsStub()) {
133 __ StubPrologue(); 133 __ StubPrologue(StackFrame::STUB);
134 } else { 134 } else {
135 __ Prologue(info()->GeneratePreagedPrologue()); 135 __ Prologue(info()->GeneratePreagedPrologue());
136 } 136 }
137 } 137 }
138 138
139 // Reserve space for the stack slots needed by the code. 139 // Reserve space for the stack slots needed by the code.
140 int slots = GetStackSlotCount(); 140 int slots = GetStackSlotCount();
141 DCHECK(slots != 0 || !info()->IsOptimizing()); 141 DCHECK(slots != 0 || !info()->IsOptimizing());
142 if (slots > 0) { 142 if (slots > 0) {
143 __ sub(Operand(esp), Immediate(slots * kPointerSize)); 143 __ sub(Operand(esp), Immediate(slots * kPointerSize));
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 } else { 273 } else {
274 if (info()->saves_caller_doubles()) RestoreCallerDoubles(); 274 if (info()->saves_caller_doubles()) RestoreCallerDoubles();
275 __ call(entry, RelocInfo::RUNTIME_ENTRY); 275 __ call(entry, RelocInfo::RUNTIME_ENTRY);
276 } 276 }
277 info()->LogDeoptCallPosition(masm()->pc_offset(), 277 info()->LogDeoptCallPosition(masm()->pc_offset(),
278 table_entry->deopt_info.inlining_id); 278 table_entry->deopt_info.inlining_id);
279 } 279 }
280 if (needs_frame.is_linked()) { 280 if (needs_frame.is_linked()) {
281 __ bind(&needs_frame); 281 __ bind(&needs_frame);
282 /* stack layout 282 /* stack layout
283 4: entry address 283 3: entry address
284 3: return address <-- esp 284 2: return address <-- esp
285 2: garbage
286 1: garbage 285 1: garbage
287 0: garbage 286 0: garbage
288 */ 287 */
289 __ sub(esp, Immediate(kPointerSize)); // Reserve space for stub marker. 288 __ push(MemOperand(esp, 0)); // Copy return address.
290 __ push(MemOperand(esp, kPointerSize)); // Copy return address. 289 __ push(MemOperand(esp, 2 * kPointerSize)); // Copy entry address.
291 __ push(MemOperand(esp, 3 * kPointerSize)); // Copy entry address.
292 290
293 /* stack layout 291 /* stack layout
294 4: entry address 292 4: entry address
295 3: return address 293 3: return address
296 2: garbage
297 1: return address 294 1: return address
298 0: entry address <-- esp 295 0: entry address <-- esp
299 */ 296 */
300 __ mov(MemOperand(esp, 4 * kPointerSize), ebp); // Save ebp. 297 __ mov(MemOperand(esp, 3 * kPointerSize), ebp); // Save ebp.
301 // Copy context.
302 __ mov(ebp, MemOperand(ebp, StandardFrameConstants::kContextOffset));
303 __ mov(MemOperand(esp, 3 * kPointerSize), ebp);
304 // Fill ebp with the right stack frame address. 298 // Fill ebp with the right stack frame address.
305 __ lea(ebp, MemOperand(esp, 4 * kPointerSize)); 299 __ lea(ebp, MemOperand(esp, 3 * kPointerSize));
300
306 // This variant of deopt can only be used with stubs. Since we don't 301 // This variant of deopt can only be used with stubs. Since we don't
307 // have a function pointer to install in the stack frame that we're 302 // have a function pointer to install in the stack frame that we're
308 // building, install a special marker there instead. 303 // building, install a special marker there instead.
309 DCHECK(info()->IsStub()); 304 DCHECK(info()->IsStub());
310 __ mov(MemOperand(esp, 2 * kPointerSize), 305 __ mov(MemOperand(esp, 2 * kPointerSize),
311 Immediate(Smi::FromInt(StackFrame::STUB))); 306 Immediate(Smi::FromInt(StackFrame::STUB)));
312 307
313 /* stack layout 308 /* stack layout
314 4: old ebp 309 3: old ebp
315 3: context pointer
316 2: stub marker 310 2: stub marker
317 1: return address 311 1: return address
318 0: entry address <-- esp 312 0: entry address <-- esp
319 */ 313 */
320 __ ret(0); // Call the continuation without clobbering registers. 314 __ ret(0); // Call the continuation without clobbering registers.
321 } 315 }
322 return !is_aborted(); 316 return !is_aborted();
323 } 317 }
324 318
325 319
(...skipping 14 matching lines...) Expand all
340 code->instr()->hydrogen_value()->id(), 334 code->instr()->hydrogen_value()->id(),
341 code->instr()->Mnemonic()); 335 code->instr()->Mnemonic());
342 __ bind(code->entry()); 336 __ bind(code->entry());
343 if (NeedsDeferredFrame()) { 337 if (NeedsDeferredFrame()) {
344 Comment(";;; Build frame"); 338 Comment(";;; Build frame");
345 DCHECK(!frame_is_built_); 339 DCHECK(!frame_is_built_);
346 DCHECK(info()->IsStub()); 340 DCHECK(info()->IsStub());
347 frame_is_built_ = true; 341 frame_is_built_ = true;
348 // Build the frame in such a way that esi isn't trashed. 342 // Build the frame in such a way that esi isn't trashed.
349 __ push(ebp); // Caller's frame pointer. 343 __ push(ebp); // Caller's frame pointer.
350 __ push(Operand(ebp, StandardFrameConstants::kContextOffset));
351 __ push(Immediate(Smi::FromInt(StackFrame::STUB))); 344 __ push(Immediate(Smi::FromInt(StackFrame::STUB)));
352 __ lea(ebp, Operand(esp, 2 * kPointerSize)); 345 __ lea(ebp, Operand(esp, TypedFrameConstants::kFixedFrameSizeFromFp));
353 Comment(";;; Deferred code"); 346 Comment(";;; Deferred code");
354 } 347 }
355 code->Generate(); 348 code->Generate();
356 if (NeedsDeferredFrame()) { 349 if (NeedsDeferredFrame()) {
357 __ bind(code->done()); 350 __ bind(code->done());
358 Comment(";;; Destroy frame"); 351 Comment(";;; Destroy frame");
359 DCHECK(frame_is_built_); 352 DCHECK(frame_is_built_);
360 frame_is_built_ = false; 353 frame_is_built_ = false;
361 __ mov(esp, ebp); 354 __ mov(esp, ebp);
362 __ pop(ebp); 355 __ pop(ebp);
(...skipping 2444 matching lines...) Expand 10 before | Expand all | Expand 10 after
2807 2800
2808 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) { 2801 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) {
2809 Register result = ToRegister(instr->result()); 2802 Register result = ToRegister(instr->result());
2810 2803
2811 if (instr->hydrogen()->from_inlined()) { 2804 if (instr->hydrogen()->from_inlined()) {
2812 __ lea(result, Operand(esp, -2 * kPointerSize)); 2805 __ lea(result, Operand(esp, -2 * kPointerSize));
2813 } else { 2806 } else {
2814 // Check for arguments adapter frame. 2807 // Check for arguments adapter frame.
2815 Label done, adapted; 2808 Label done, adapted;
2816 __ mov(result, Operand(ebp, StandardFrameConstants::kCallerFPOffset)); 2809 __ mov(result, Operand(ebp, StandardFrameConstants::kCallerFPOffset));
2817 __ mov(result, Operand(result, StandardFrameConstants::kContextOffset)); 2810 __ mov(result,
2811 Operand(result, CommonFrameConstants::kContextOrFrameTypeOffset));
2818 __ cmp(Operand(result), 2812 __ cmp(Operand(result),
2819 Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); 2813 Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)));
2820 __ j(equal, &adapted, Label::kNear); 2814 __ j(equal, &adapted, Label::kNear);
2821 2815
2822 // No arguments adaptor frame. 2816 // No arguments adaptor frame.
2823 __ mov(result, Operand(ebp)); 2817 __ mov(result, Operand(ebp));
2824 __ jmp(&done, Label::kNear); 2818 __ jmp(&done, Label::kNear);
2825 2819
2826 // Arguments adaptor frame present. 2820 // Arguments adaptor frame present.
2827 __ bind(&adapted); 2821 __ bind(&adapted);
(...skipping 2449 matching lines...) Expand 10 before | Expand all | Expand 10 after
5277 __ mov(Operand(ebp, StandardFrameConstants::kContextOffset), context); 5271 __ mov(Operand(ebp, StandardFrameConstants::kContextOffset), context);
5278 } 5272 }
5279 5273
5280 5274
5281 #undef __ 5275 #undef __
5282 5276
5283 } // namespace internal 5277 } // namespace internal
5284 } // namespace v8 5278 } // namespace v8
5285 5279
5286 #endif // V8_TARGET_ARCH_IA32 5280 #endif // V8_TARGET_ARCH_IA32
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698