OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |