| 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 #include "src/v8.h" | 5 #include "src/v8.h" | 
| 6 | 6 | 
| 7 #if V8_TARGET_ARCH_X64 | 7 #if V8_TARGET_ARCH_X64 | 
| 8 | 8 | 
| 9 #include "src/x64/lithium-codegen-x64.h" | 9 #include "src/x64/lithium-codegen-x64.h" | 
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" | 
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 160   // Reserve space for the stack slots needed by the code. | 160   // Reserve space for the stack slots needed by the code. | 
| 161   int slots = GetStackSlotCount(); | 161   int slots = GetStackSlotCount(); | 
| 162   if (slots > 0) { | 162   if (slots > 0) { | 
| 163     if (FLAG_debug_code) { | 163     if (FLAG_debug_code) { | 
| 164       __ subp(rsp, Immediate(slots * kPointerSize)); | 164       __ subp(rsp, Immediate(slots * kPointerSize)); | 
| 165 #ifdef _MSC_VER | 165 #ifdef _MSC_VER | 
| 166       MakeSureStackPagesMapped(slots * kPointerSize); | 166       MakeSureStackPagesMapped(slots * kPointerSize); | 
| 167 #endif | 167 #endif | 
| 168       __ Push(rax); | 168       __ Push(rax); | 
| 169       __ Set(rax, slots); | 169       __ Set(rax, slots); | 
| 170       __ movq(kScratchRegister, kSlotsZapValue); | 170       __ Set(kScratchRegister, kSlotsZapValue); | 
| 171       Label loop; | 171       Label loop; | 
| 172       __ bind(&loop); | 172       __ bind(&loop); | 
| 173       __ movp(MemOperand(rsp, rax, times_pointer_size, 0), | 173       __ movp(MemOperand(rsp, rax, times_pointer_size, 0), | 
| 174               kScratchRegister); | 174               kScratchRegister); | 
| 175       __ decl(rax); | 175       __ decl(rax); | 
| 176       __ j(not_zero, &loop); | 176       __ j(not_zero, &loop); | 
| 177       __ Pop(rax); | 177       __ Pop(rax); | 
| 178     } else { | 178     } else { | 
| 179       __ subp(rsp, Immediate(slots * kPointerSize)); | 179       __ subp(rsp, Immediate(slots * kPointerSize)); | 
| 180 #ifdef _MSC_VER | 180 #ifdef _MSC_VER | 
| (...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 737       Deoptimizer::GetDeoptimizationEntry(isolate(), id, bailout_type); | 737       Deoptimizer::GetDeoptimizationEntry(isolate(), id, bailout_type); | 
| 738   if (entry == NULL) { | 738   if (entry == NULL) { | 
| 739     Abort(kBailoutWasNotPrepared); | 739     Abort(kBailoutWasNotPrepared); | 
| 740     return; | 740     return; | 
| 741   } | 741   } | 
| 742 | 742 | 
| 743   if (DeoptEveryNTimes()) { | 743   if (DeoptEveryNTimes()) { | 
| 744     ExternalReference count = ExternalReference::stress_deopt_count(isolate()); | 744     ExternalReference count = ExternalReference::stress_deopt_count(isolate()); | 
| 745     Label no_deopt; | 745     Label no_deopt; | 
| 746     __ pushfq(); | 746     __ pushfq(); | 
| 747     __ Push(rax); | 747     __ pushq(rax); | 
| 748     Operand count_operand = masm()->ExternalOperand(count, kScratchRegister); | 748     Operand count_operand = masm()->ExternalOperand(count, kScratchRegister); | 
| 749     __ movl(rax, count_operand); | 749     __ movl(rax, count_operand); | 
| 750     __ subl(rax, Immediate(1)); | 750     __ subl(rax, Immediate(1)); | 
| 751     __ j(not_zero, &no_deopt, Label::kNear); | 751     __ j(not_zero, &no_deopt, Label::kNear); | 
| 752     if (FLAG_trap_on_deopt) __ int3(); | 752     if (FLAG_trap_on_deopt) __ int3(); | 
| 753     __ movl(rax, Immediate(FLAG_deopt_every_n_times)); | 753     __ movl(rax, Immediate(FLAG_deopt_every_n_times)); | 
| 754     __ movl(count_operand, rax); | 754     __ movl(count_operand, rax); | 
| 755     __ Pop(rax); | 755     __ popq(rax); | 
| 756     __ popfq(); | 756     __ popfq(); | 
| 757     ASSERT(frame_is_built_); | 757     ASSERT(frame_is_built_); | 
| 758     __ call(entry, RelocInfo::RUNTIME_ENTRY); | 758     __ call(entry, RelocInfo::RUNTIME_ENTRY); | 
| 759     __ bind(&no_deopt); | 759     __ bind(&no_deopt); | 
| 760     __ movl(count_operand, rax); | 760     __ movl(count_operand, rax); | 
| 761     __ Pop(rax); | 761     __ popq(rax); | 
| 762     __ popfq(); | 762     __ popfq(); | 
| 763   } | 763   } | 
| 764 | 764 | 
| 765   if (info()->ShouldTrapOnDeopt()) { | 765   if (info()->ShouldTrapOnDeopt()) { | 
| 766     Label done; | 766     Label done; | 
| 767     if (cc != no_condition) { | 767     if (cc != no_condition) { | 
| 768       __ j(NegateCondition(cc), &done, Label::kNear); | 768       __ j(NegateCondition(cc), &done, Label::kNear); | 
| 769     } | 769     } | 
| 770     __ int3(); | 770     __ int3(); | 
| 771     __ bind(&done); | 771     __ bind(&done); | 
| (...skipping 1967 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2739                                                Label* map_check) { | 2739                                                Label* map_check) { | 
| 2740   { | 2740   { | 
| 2741     PushSafepointRegistersScope scope(this); | 2741     PushSafepointRegistersScope scope(this); | 
| 2742     InstanceofStub::Flags flags = static_cast<InstanceofStub::Flags>( | 2742     InstanceofStub::Flags flags = static_cast<InstanceofStub::Flags>( | 
| 2743         InstanceofStub::kNoFlags | InstanceofStub::kCallSiteInlineCheck); | 2743         InstanceofStub::kNoFlags | InstanceofStub::kCallSiteInlineCheck); | 
| 2744     InstanceofStub stub(isolate(), flags); | 2744     InstanceofStub stub(isolate(), flags); | 
| 2745 | 2745 | 
| 2746     __ Push(ToRegister(instr->value())); | 2746     __ Push(ToRegister(instr->value())); | 
| 2747     __ Push(instr->function()); | 2747     __ Push(instr->function()); | 
| 2748 | 2748 | 
| 2749     static const int kAdditionalDelta = 10; | 2749     static const int kAdditionalDelta = kPointerSize == kInt64Size ? 10 : 16; | 
| 2750     int delta = | 2750     int delta = | 
| 2751         masm_->SizeOfCodeGeneratedSince(map_check) + kAdditionalDelta; | 2751         masm_->SizeOfCodeGeneratedSince(map_check) + kAdditionalDelta; | 
| 2752     ASSERT(delta >= 0); | 2752     ASSERT(delta >= 0); | 
| 2753     __ PushImm32(delta); | 2753     __ PushImm32(delta); | 
| 2754 | 2754 | 
| 2755     // We are pushing three values on the stack but recording a | 2755     // We are pushing three values on the stack but recording a | 
| 2756     // safepoint with two arguments because stub is going to | 2756     // safepoint with two arguments because stub is going to | 
| 2757     // remove the third argument from the stack before jumping | 2757     // remove the third argument from the stack before jumping | 
| 2758     // to instanceof builtin on the slow path. | 2758     // to instanceof builtin on the slow path. | 
| 2759     CallCodeGeneric(stub.GetCode(), | 2759     CallCodeGeneric(stub.GetCode(), | 
| (...skipping 1948 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4708     __ SmiToInteger32(reg, reg); | 4708     __ SmiToInteger32(reg, reg); | 
| 4709     __ xorl(reg, Immediate(0x80000000)); | 4709     __ xorl(reg, Immediate(0x80000000)); | 
| 4710     __ cvtlsi2sd(temp_xmm, reg); | 4710     __ cvtlsi2sd(temp_xmm, reg); | 
| 4711   } else { | 4711   } else { | 
| 4712     ASSERT(signedness == UNSIGNED_INT32); | 4712     ASSERT(signedness == UNSIGNED_INT32); | 
| 4713     __ LoadUint32(temp_xmm, reg); | 4713     __ LoadUint32(temp_xmm, reg); | 
| 4714   } | 4714   } | 
| 4715 | 4715 | 
| 4716   if (FLAG_inline_new) { | 4716   if (FLAG_inline_new) { | 
| 4717     __ AllocateHeapNumber(reg, tmp, &slow); | 4717     __ AllocateHeapNumber(reg, tmp, &slow); | 
| 4718     __ jmp(&done, Label::kNear); | 4718     __ jmp(&done, kPointerSize == kInt64Size ? Label::kNear : Label::kFar); | 
| 4719   } | 4719   } | 
| 4720 | 4720 | 
| 4721   // Slow case: Call the runtime system to do the number allocation. | 4721   // Slow case: Call the runtime system to do the number allocation. | 
| 4722   __ bind(&slow); | 4722   __ bind(&slow); | 
| 4723   { | 4723   { | 
| 4724     // Put a valid pointer value in the stack slot where the result | 4724     // Put a valid pointer value in the stack slot where the result | 
| 4725     // register is stored, as this register is in the pointer map, but contains | 4725     // register is stored, as this register is in the pointer map, but contains | 
| 4726     // an integer value. | 4726     // an integer value. | 
| 4727     __ Set(reg, 0); | 4727     __ Set(reg, 0); | 
| 4728 | 4728 | 
| (...skipping 1114 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5843   CallRuntime(Runtime::kHiddenPushBlockContext, 2, instr); | 5843   CallRuntime(Runtime::kHiddenPushBlockContext, 2, instr); | 
| 5844   RecordSafepoint(Safepoint::kNoLazyDeopt); | 5844   RecordSafepoint(Safepoint::kNoLazyDeopt); | 
| 5845 } | 5845 } | 
| 5846 | 5846 | 
| 5847 | 5847 | 
| 5848 #undef __ | 5848 #undef __ | 
| 5849 | 5849 | 
| 5850 } }  // namespace v8::internal | 5850 } }  // namespace v8::internal | 
| 5851 | 5851 | 
| 5852 #endif  // V8_TARGET_ARCH_X64 | 5852 #endif  // V8_TARGET_ARCH_X64 | 
| OLD | NEW | 
|---|