| 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_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 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 | 91 |
| 92 if (info()->IsOptimizing()) { | 92 if (info()->IsOptimizing()) { |
| 93 ProfileEntryHookStub::MaybeCallEntryHook(masm_); | 93 ProfileEntryHookStub::MaybeCallEntryHook(masm_); |
| 94 } | 94 } |
| 95 | 95 |
| 96 info()->set_prologue_offset(masm_->pc_offset()); | 96 info()->set_prologue_offset(masm_->pc_offset()); |
| 97 if (NeedsEagerFrame()) { | 97 if (NeedsEagerFrame()) { |
| 98 DCHECK(!frame_is_built_); | 98 DCHECK(!frame_is_built_); |
| 99 frame_is_built_ = true; | 99 frame_is_built_ = true; |
| 100 if (info()->IsStub()) { | 100 if (info()->IsStub()) { |
| 101 __ StubPrologue(); | 101 __ StubPrologue(StackFrame::STUB); |
| 102 } else { | 102 } else { |
| 103 __ Prologue(info()->GeneratePreagedPrologue()); | 103 __ Prologue(info()->GeneratePreagedPrologue()); |
| 104 } | 104 } |
| 105 } | 105 } |
| 106 | 106 |
| 107 // Reserve space for the stack slots needed by the code. | 107 // Reserve space for the stack slots needed by the code. |
| 108 int slots = GetStackSlotCount(); | 108 int slots = GetStackSlotCount(); |
| 109 DCHECK(slots != 0 || !info()->IsOptimizing()); | 109 DCHECK(slots != 0 || !info()->IsOptimizing()); |
| 110 if (slots > 0) { | 110 if (slots > 0) { |
| 111 __ sub(Operand(esp), Immediate(slots * kPointerSize)); | 111 __ sub(Operand(esp), Immediate(slots * kPointerSize)); |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 __ push(Immediate(ExternalReference::ForDeoptEntry(entry))); | 266 __ push(Immediate(ExternalReference::ForDeoptEntry(entry))); |
| 267 __ call(&needs_frame); | 267 __ call(&needs_frame); |
| 268 } else { | 268 } else { |
| 269 __ call(entry, RelocInfo::RUNTIME_ENTRY); | 269 __ call(entry, RelocInfo::RUNTIME_ENTRY); |
| 270 } | 270 } |
| 271 info()->LogDeoptCallPosition(masm()->pc_offset(), | 271 info()->LogDeoptCallPosition(masm()->pc_offset(), |
| 272 table_entry->deopt_info.inlining_id); | 272 table_entry->deopt_info.inlining_id); |
| 273 } | 273 } |
| 274 if (needs_frame.is_linked()) { | 274 if (needs_frame.is_linked()) { |
| 275 __ bind(&needs_frame); | 275 __ bind(&needs_frame); |
| 276 | |
| 277 /* stack layout | 276 /* stack layout |
| 278 4: entry address | 277 3: entry address |
| 279 3: return address <-- esp | 278 2: return address <-- esp |
| 280 2: garbage | |
| 281 1: garbage | 279 1: garbage |
| 282 0: garbage | 280 0: garbage |
| 283 */ | 281 */ |
| 284 __ sub(esp, Immediate(kPointerSize)); // Reserve space for stub marker. | 282 __ push(MemOperand(esp, 0)); // Copy return address. |
| 285 __ push(MemOperand(esp, kPointerSize)); // Copy return address. | 283 __ push(MemOperand(esp, 2 * kPointerSize)); // Copy entry address. |
| 286 __ push(MemOperand(esp, 3 * kPointerSize)); // Copy entry address. | |
| 287 | 284 |
| 288 /* stack layout | 285 /* stack layout |
| 289 4: entry address | 286 4: entry address |
| 290 3: return address | 287 3: return address |
| 291 2: garbage | |
| 292 1: return address | 288 1: return address |
| 293 0: entry address <-- esp | 289 0: entry address <-- esp |
| 294 */ | 290 */ |
| 295 __ mov(MemOperand(esp, 4 * kPointerSize), ebp); // Save ebp. | 291 __ mov(MemOperand(esp, 3 * kPointerSize), ebp); // Save ebp. |
| 296 | |
| 297 // Copy context. | |
| 298 __ mov(ebp, MemOperand(ebp, StandardFrameConstants::kContextOffset)); | |
| 299 __ mov(MemOperand(esp, 3 * kPointerSize), ebp); | |
| 300 // Fill ebp with the right stack frame address. | 292 // Fill ebp with the right stack frame address. |
| 301 __ lea(ebp, MemOperand(esp, 4 * kPointerSize)); | 293 __ lea(ebp, MemOperand(esp, 3 * kPointerSize)); |
| 302 | 294 |
| 303 // This variant of deopt can only be used with stubs. Since we don't | 295 // This variant of deopt can only be used with stubs. Since we don't |
| 304 // have a function pointer to install in the stack frame that we're | 296 // have a function pointer to install in the stack frame that we're |
| 305 // building, install a special marker there instead. | 297 // building, install a special marker there instead. |
| 306 DCHECK(info()->IsStub()); | 298 DCHECK(info()->IsStub()); |
| 307 __ mov(MemOperand(esp, 2 * kPointerSize), | 299 __ mov(MemOperand(esp, 2 * kPointerSize), |
| 308 Immediate(Smi::FromInt(StackFrame::STUB))); | 300 Immediate(Smi::FromInt(StackFrame::STUB))); |
| 309 | 301 |
| 310 /* stack layout | 302 /* stack layout |
| 311 4: old ebp | 303 3: old ebp |
| 312 3: context pointer | |
| 313 2: stub marker | 304 2: stub marker |
| 314 1: return address | 305 1: return address |
| 315 0: entry address <-- esp | 306 0: entry address <-- esp |
| 316 */ | 307 */ |
| 317 __ ret(0); // Call the continuation without clobbering registers. | 308 __ ret(0); // Call the continuation without clobbering registers. |
| 318 } | 309 } |
| 319 return !is_aborted(); | 310 return !is_aborted(); |
| 320 } | 311 } |
| 321 | 312 |
| 322 | 313 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 339 code->instr()->hydrogen_value()->id(), | 330 code->instr()->hydrogen_value()->id(), |
| 340 code->instr()->Mnemonic()); | 331 code->instr()->Mnemonic()); |
| 341 __ bind(code->entry()); | 332 __ bind(code->entry()); |
| 342 if (NeedsDeferredFrame()) { | 333 if (NeedsDeferredFrame()) { |
| 343 Comment(";;; Build frame"); | 334 Comment(";;; Build frame"); |
| 344 DCHECK(!frame_is_built_); | 335 DCHECK(!frame_is_built_); |
| 345 DCHECK(info()->IsStub()); | 336 DCHECK(info()->IsStub()); |
| 346 frame_is_built_ = true; | 337 frame_is_built_ = true; |
| 347 // Build the frame in such a way that esi isn't trashed. | 338 // Build the frame in such a way that esi isn't trashed. |
| 348 __ push(ebp); // Caller's frame pointer. | 339 __ push(ebp); // Caller's frame pointer. |
| 349 __ push(Operand(ebp, StandardFrameConstants::kContextOffset)); | |
| 350 __ push(Immediate(Smi::FromInt(StackFrame::STUB))); | 340 __ push(Immediate(Smi::FromInt(StackFrame::STUB))); |
| 351 __ lea(ebp, Operand(esp, 2 * kPointerSize)); | 341 __ lea(ebp, Operand(esp, TypedFrameConstants::kFixedFrameSizeFromFp)); |
| 352 Comment(";;; Deferred code"); | 342 Comment(";;; Deferred code"); |
| 353 } | 343 } |
| 354 code->Generate(); | 344 code->Generate(); |
| 355 if (NeedsDeferredFrame()) { | 345 if (NeedsDeferredFrame()) { |
| 356 __ bind(code->done()); | 346 __ bind(code->done()); |
| 357 Comment(";;; Destroy frame"); | 347 Comment(";;; Destroy frame"); |
| 358 DCHECK(frame_is_built_); | 348 DCHECK(frame_is_built_); |
| 359 frame_is_built_ = false; | 349 frame_is_built_ = false; |
| 360 __ mov(esp, ebp); | 350 __ mov(esp, ebp); |
| 361 __ pop(ebp); | 351 __ pop(ebp); |
| (...skipping 2719 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3081 | 3071 |
| 3082 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) { | 3072 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) { |
| 3083 Register result = ToRegister(instr->result()); | 3073 Register result = ToRegister(instr->result()); |
| 3084 | 3074 |
| 3085 if (instr->hydrogen()->from_inlined()) { | 3075 if (instr->hydrogen()->from_inlined()) { |
| 3086 __ lea(result, Operand(esp, -2 * kPointerSize)); | 3076 __ lea(result, Operand(esp, -2 * kPointerSize)); |
| 3087 } else { | 3077 } else { |
| 3088 // Check for arguments adapter frame. | 3078 // Check for arguments adapter frame. |
| 3089 Label done, adapted; | 3079 Label done, adapted; |
| 3090 __ mov(result, Operand(ebp, StandardFrameConstants::kCallerFPOffset)); | 3080 __ mov(result, Operand(ebp, StandardFrameConstants::kCallerFPOffset)); |
| 3091 __ mov(result, Operand(result, StandardFrameConstants::kContextOffset)); | 3081 __ mov(result, |
| 3082 Operand(result, CommonFrameConstants::kContextOrFrameTypeOffset)); |
| 3092 __ cmp(Operand(result), | 3083 __ cmp(Operand(result), |
| 3093 Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); | 3084 Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); |
| 3094 __ j(equal, &adapted, Label::kNear); | 3085 __ j(equal, &adapted, Label::kNear); |
| 3095 | 3086 |
| 3096 // No arguments adaptor frame. | 3087 // No arguments adaptor frame. |
| 3097 __ mov(result, Operand(ebp)); | 3088 __ mov(result, Operand(ebp)); |
| 3098 __ jmp(&done, Label::kNear); | 3089 __ jmp(&done, Label::kNear); |
| 3099 | 3090 |
| 3100 // Arguments adaptor frame present. | 3091 // Arguments adaptor frame present. |
| 3101 __ bind(&adapted); | 3092 __ bind(&adapted); |
| (...skipping 2731 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5833 __ mov(Operand(ebp, StandardFrameConstants::kContextOffset), context); | 5824 __ mov(Operand(ebp, StandardFrameConstants::kContextOffset), context); |
| 5834 } | 5825 } |
| 5835 | 5826 |
| 5836 | 5827 |
| 5837 #undef __ | 5828 #undef __ |
| 5838 | 5829 |
| 5839 } // namespace internal | 5830 } // namespace internal |
| 5840 } // namespace v8 | 5831 } // namespace v8 |
| 5841 | 5832 |
| 5842 #endif // V8_TARGET_ARCH_X87 | 5833 #endif // V8_TARGET_ARCH_X87 |
| OLD | NEW |