OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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_X64 | 5 #if V8_TARGET_ARCH_X64 |
6 | 6 |
7 #include "src/crankshaft/x64/lithium-codegen-x64.h" | 7 #include "src/crankshaft/x64/lithium-codegen-x64.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 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 | 118 |
119 if (info()->IsOptimizing()) { | 119 if (info()->IsOptimizing()) { |
120 ProfileEntryHookStub::MaybeCallEntryHook(masm_); | 120 ProfileEntryHookStub::MaybeCallEntryHook(masm_); |
121 } | 121 } |
122 | 122 |
123 info()->set_prologue_offset(masm_->pc_offset()); | 123 info()->set_prologue_offset(masm_->pc_offset()); |
124 if (NeedsEagerFrame()) { | 124 if (NeedsEagerFrame()) { |
125 DCHECK(!frame_is_built_); | 125 DCHECK(!frame_is_built_); |
126 frame_is_built_ = true; | 126 frame_is_built_ = true; |
127 if (info()->IsStub()) { | 127 if (info()->IsStub()) { |
128 __ StubPrologue(); | 128 __ StubPrologue(StackFrame::STUB); |
129 } else { | 129 } else { |
130 __ Prologue(info()->GeneratePreagedPrologue()); | 130 __ Prologue(info()->GeneratePreagedPrologue()); |
131 } | 131 } |
132 } | 132 } |
133 | 133 |
134 // Reserve space for the stack slots needed by the code. | 134 // Reserve space for the stack slots needed by the code. |
135 int slots = GetStackSlotCount(); | 135 int slots = GetStackSlotCount(); |
136 if (slots > 0) { | 136 if (slots > 0) { |
137 if (FLAG_debug_code) { | 137 if (FLAG_debug_code) { |
138 __ subp(rsp, Immediate(slots * kPointerSize)); | 138 __ subp(rsp, Immediate(slots * kPointerSize)); |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
299 } | 299 } |
300 __ call(entry, RelocInfo::RUNTIME_ENTRY); | 300 __ call(entry, RelocInfo::RUNTIME_ENTRY); |
301 } | 301 } |
302 info()->LogDeoptCallPosition(masm()->pc_offset(), | 302 info()->LogDeoptCallPosition(masm()->pc_offset(), |
303 table_entry->deopt_info.inlining_id); | 303 table_entry->deopt_info.inlining_id); |
304 } | 304 } |
305 | 305 |
306 if (needs_frame.is_linked()) { | 306 if (needs_frame.is_linked()) { |
307 __ bind(&needs_frame); | 307 __ bind(&needs_frame); |
308 /* stack layout | 308 /* stack layout |
309 4: return address <-- rsp | 309 3: return address <-- rsp |
310 3: garbage | |
311 2: garbage | 310 2: garbage |
312 1: garbage | 311 1: garbage |
313 0: garbage | 312 0: garbage |
314 */ | 313 */ |
315 // Reserve space for context and stub marker. | 314 // Reserve space for stub marker. |
316 __ subp(rsp, Immediate(2 * kPointerSize)); | 315 __ subp(rsp, Immediate(TypedFrameConstants::kFrameTypeSize)); |
317 __ Push(MemOperand(rsp, 2 * kPointerSize)); // Copy return address. | 316 __ Push(MemOperand( |
318 __ Push(kScratchRegister); // Save entry address for ret(0) | 317 rsp, TypedFrameConstants::kFrameTypeSize)); // Copy return address. |
| 318 __ Push(kScratchRegister); |
319 | 319 |
320 /* stack layout | 320 /* stack layout |
321 4: return address | 321 3: return address |
322 3: garbage | |
323 2: garbage | 322 2: garbage |
324 1: return address | 323 1: return address |
325 0: entry address <-- rsp | 324 0: entry address <-- rsp |
326 */ | 325 */ |
327 | 326 |
328 // Remember context pointer. | |
329 __ movp(kScratchRegister, | |
330 MemOperand(rbp, StandardFrameConstants::kContextOffset)); | |
331 // Save context pointer into the stack frame. | |
332 __ movp(MemOperand(rsp, 3 * kPointerSize), kScratchRegister); | |
333 | |
334 // Create a stack frame. | 327 // Create a stack frame. |
335 __ movp(MemOperand(rsp, 4 * kPointerSize), rbp); | 328 __ movp(MemOperand(rsp, 3 * kPointerSize), rbp); |
336 __ leap(rbp, MemOperand(rsp, 4 * kPointerSize)); | 329 __ leap(rbp, MemOperand(rsp, 3 * kPointerSize)); |
337 | 330 |
338 // This variant of deopt can only be used with stubs. Since we don't | 331 // This variant of deopt can only be used with stubs. Since we don't |
339 // have a function pointer to install in the stack frame that we're | 332 // have a function pointer to install in the stack frame that we're |
340 // building, install a special marker there instead. | 333 // building, install a special marker there instead. |
341 DCHECK(info()->IsStub()); | 334 DCHECK(info()->IsStub()); |
342 __ Move(MemOperand(rsp, 2 * kPointerSize), Smi::FromInt(StackFrame::STUB)); | 335 __ Move(MemOperand(rsp, 2 * kPointerSize), Smi::FromInt(StackFrame::STUB)); |
343 | 336 |
344 /* stack layout | 337 /* stack layout |
345 4: old rbp | 338 3: old rbp |
346 3: context pointer | |
347 2: stub marker | 339 2: stub marker |
348 1: return address | 340 1: return address |
349 0: entry address <-- rsp | 341 0: entry address <-- rsp |
350 */ | 342 */ |
351 __ ret(0); | 343 __ ret(0); |
352 } | 344 } |
353 | 345 |
354 return !is_aborted(); | 346 return !is_aborted(); |
355 } | 347 } |
356 | 348 |
(...skipping 15 matching lines...) Expand all Loading... |
372 code->instr()->hydrogen_value()->id(), | 364 code->instr()->hydrogen_value()->id(), |
373 code->instr()->Mnemonic()); | 365 code->instr()->Mnemonic()); |
374 __ bind(code->entry()); | 366 __ bind(code->entry()); |
375 if (NeedsDeferredFrame()) { | 367 if (NeedsDeferredFrame()) { |
376 Comment(";;; Build frame"); | 368 Comment(";;; Build frame"); |
377 DCHECK(!frame_is_built_); | 369 DCHECK(!frame_is_built_); |
378 DCHECK(info()->IsStub()); | 370 DCHECK(info()->IsStub()); |
379 frame_is_built_ = true; | 371 frame_is_built_ = true; |
380 // Build the frame in such a way that esi isn't trashed. | 372 // Build the frame in such a way that esi isn't trashed. |
381 __ pushq(rbp); // Caller's frame pointer. | 373 __ pushq(rbp); // Caller's frame pointer. |
382 __ Push(Operand(rbp, StandardFrameConstants::kContextOffset)); | |
383 __ Push(Smi::FromInt(StackFrame::STUB)); | 374 __ Push(Smi::FromInt(StackFrame::STUB)); |
384 __ leap(rbp, Operand(rsp, 2 * kPointerSize)); | 375 __ leap(rbp, Operand(rsp, TypedFrameConstants::kFixedFrameSizeFromFp)); |
385 Comment(";;; Deferred code"); | 376 Comment(";;; Deferred code"); |
386 } | 377 } |
387 code->Generate(); | 378 code->Generate(); |
388 if (NeedsDeferredFrame()) { | 379 if (NeedsDeferredFrame()) { |
389 __ bind(code->done()); | 380 __ bind(code->done()); |
390 Comment(";;; Destroy frame"); | 381 Comment(";;; Destroy frame"); |
391 DCHECK(frame_is_built_); | 382 DCHECK(frame_is_built_); |
392 frame_is_built_ = false; | 383 frame_is_built_ = false; |
393 __ movp(rsp, rbp); | 384 __ movp(rsp, rbp); |
394 __ popq(rbp); | 385 __ popq(rbp); |
(...skipping 2612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3007 | 2998 |
3008 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) { | 2999 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) { |
3009 Register result = ToRegister(instr->result()); | 3000 Register result = ToRegister(instr->result()); |
3010 | 3001 |
3011 if (instr->hydrogen()->from_inlined()) { | 3002 if (instr->hydrogen()->from_inlined()) { |
3012 __ leap(result, Operand(rsp, -kFPOnStackSize + -kPCOnStackSize)); | 3003 __ leap(result, Operand(rsp, -kFPOnStackSize + -kPCOnStackSize)); |
3013 } else { | 3004 } else { |
3014 // Check for arguments adapter frame. | 3005 // Check for arguments adapter frame. |
3015 Label done, adapted; | 3006 Label done, adapted; |
3016 __ movp(result, Operand(rbp, StandardFrameConstants::kCallerFPOffset)); | 3007 __ movp(result, Operand(rbp, StandardFrameConstants::kCallerFPOffset)); |
3017 __ Cmp(Operand(result, StandardFrameConstants::kContextOffset), | 3008 __ Cmp(Operand(result, CommonFrameConstants::kContextOrFrameTypeOffset), |
3018 Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)); | 3009 Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)); |
3019 __ j(equal, &adapted, Label::kNear); | 3010 __ j(equal, &adapted, Label::kNear); |
3020 | 3011 |
3021 // No arguments adaptor frame. | 3012 // No arguments adaptor frame. |
3022 __ movp(result, rbp); | 3013 __ movp(result, rbp); |
3023 __ jmp(&done, Label::kNear); | 3014 __ jmp(&done, Label::kNear); |
3024 | 3015 |
3025 // Arguments adaptor frame present. | 3016 // Arguments adaptor frame present. |
3026 __ bind(&adapted); | 3017 __ bind(&adapted); |
3027 __ movp(result, Operand(rbp, StandardFrameConstants::kCallerFPOffset)); | 3018 __ movp(result, Operand(rbp, StandardFrameConstants::kCallerFPOffset)); |
(...skipping 2486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5514 __ movp(Operand(rbp, StandardFrameConstants::kContextOffset), context); | 5505 __ movp(Operand(rbp, StandardFrameConstants::kContextOffset), context); |
5515 } | 5506 } |
5516 | 5507 |
5517 | 5508 |
5518 #undef __ | 5509 #undef __ |
5519 | 5510 |
5520 } // namespace internal | 5511 } // namespace internal |
5521 } // namespace v8 | 5512 } // namespace v8 |
5522 | 5513 |
5523 #endif // V8_TARGET_ARCH_X64 | 5514 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |