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 #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/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 void MacroAssembler::Check(Condition cc, BailoutReason reason) { | 535 void MacroAssembler::Check(Condition cc, BailoutReason reason) { |
536 Label L; | 536 Label L; |
537 j(cc, &L, Label::kNear); | 537 j(cc, &L, Label::kNear); |
538 Abort(reason); | 538 Abort(reason); |
539 // Control will not return here. | 539 // Control will not return here. |
540 bind(&L); | 540 bind(&L); |
541 } | 541 } |
542 | 542 |
543 | 543 |
544 void MacroAssembler::CheckStackAlignment() { | 544 void MacroAssembler::CheckStackAlignment() { |
545 int frame_alignment = OS::ActivationFrameAlignment(); | 545 int frame_alignment = base::OS::ActivationFrameAlignment(); |
546 int frame_alignment_mask = frame_alignment - 1; | 546 int frame_alignment_mask = frame_alignment - 1; |
547 if (frame_alignment > kPointerSize) { | 547 if (frame_alignment > kPointerSize) { |
548 ASSERT(IsPowerOf2(frame_alignment)); | 548 ASSERT(IsPowerOf2(frame_alignment)); |
549 Label alignment_as_expected; | 549 Label alignment_as_expected; |
550 testp(rsp, Immediate(frame_alignment_mask)); | 550 testp(rsp, Immediate(frame_alignment_mask)); |
551 j(zero, &alignment_as_expected, Label::kNear); | 551 j(zero, &alignment_as_expected, Label::kNear); |
552 // Abort if stack is not aligned. | 552 // Abort if stack is not aligned. |
553 int3(); | 553 int3(); |
554 bind(&alignment_as_expected); | 554 bind(&alignment_as_expected); |
555 } | 555 } |
(...skipping 3534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4090 int offset = -2 * kPointerSize; | 4090 int offset = -2 * kPointerSize; |
4091 for (int i = 0; i < XMMRegister::NumAllocatableRegisters(); i++) { | 4091 for (int i = 0; i < XMMRegister::NumAllocatableRegisters(); i++) { |
4092 XMMRegister reg = XMMRegister::FromAllocationIndex(i); | 4092 XMMRegister reg = XMMRegister::FromAllocationIndex(i); |
4093 movsd(Operand(rbp, offset - ((i + 1) * kDoubleSize)), reg); | 4093 movsd(Operand(rbp, offset - ((i + 1) * kDoubleSize)), reg); |
4094 } | 4094 } |
4095 } else if (arg_stack_space > 0) { | 4095 } else if (arg_stack_space > 0) { |
4096 subp(rsp, Immediate(arg_stack_space * kRegisterSize)); | 4096 subp(rsp, Immediate(arg_stack_space * kRegisterSize)); |
4097 } | 4097 } |
4098 | 4098 |
4099 // Get the required frame alignment for the OS. | 4099 // Get the required frame alignment for the OS. |
4100 const int kFrameAlignment = OS::ActivationFrameAlignment(); | 4100 const int kFrameAlignment = base::OS::ActivationFrameAlignment(); |
4101 if (kFrameAlignment > 0) { | 4101 if (kFrameAlignment > 0) { |
4102 ASSERT(IsPowerOf2(kFrameAlignment)); | 4102 ASSERT(IsPowerOf2(kFrameAlignment)); |
4103 ASSERT(is_int8(kFrameAlignment)); | 4103 ASSERT(is_int8(kFrameAlignment)); |
4104 andp(rsp, Immediate(-kFrameAlignment)); | 4104 andp(rsp, Immediate(-kFrameAlignment)); |
4105 } | 4105 } |
4106 | 4106 |
4107 // Patch the saved entry sp. | 4107 // Patch the saved entry sp. |
4108 movp(Operand(rbp, ExitFrameConstants::kSPOffset), rsp); | 4108 movp(Operand(rbp, ExitFrameConstants::kSPOffset), rsp); |
4109 } | 4109 } |
4110 | 4110 |
(...skipping 859 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4970 | 4970 |
4971 SmiCompare(index, Smi::FromInt(0)); | 4971 SmiCompare(index, Smi::FromInt(0)); |
4972 Check(greater_equal, kIndexIsNegative); | 4972 Check(greater_equal, kIndexIsNegative); |
4973 | 4973 |
4974 // Restore the index | 4974 // Restore the index |
4975 SmiToInteger32(index, index); | 4975 SmiToInteger32(index, index); |
4976 } | 4976 } |
4977 | 4977 |
4978 | 4978 |
4979 void MacroAssembler::PrepareCallCFunction(int num_arguments) { | 4979 void MacroAssembler::PrepareCallCFunction(int num_arguments) { |
4980 int frame_alignment = OS::ActivationFrameAlignment(); | 4980 int frame_alignment = base::OS::ActivationFrameAlignment(); |
4981 ASSERT(frame_alignment != 0); | 4981 ASSERT(frame_alignment != 0); |
4982 ASSERT(num_arguments >= 0); | 4982 ASSERT(num_arguments >= 0); |
4983 | 4983 |
4984 // Make stack end at alignment and allocate space for arguments and old rsp. | 4984 // Make stack end at alignment and allocate space for arguments and old rsp. |
4985 movp(kScratchRegister, rsp); | 4985 movp(kScratchRegister, rsp); |
4986 ASSERT(IsPowerOf2(frame_alignment)); | 4986 ASSERT(IsPowerOf2(frame_alignment)); |
4987 int argument_slots_on_stack = | 4987 int argument_slots_on_stack = |
4988 ArgumentStackSlotsForCFunctionCall(num_arguments); | 4988 ArgumentStackSlotsForCFunctionCall(num_arguments); |
4989 subp(rsp, Immediate((argument_slots_on_stack + 1) * kRegisterSize)); | 4989 subp(rsp, Immediate((argument_slots_on_stack + 1) * kRegisterSize)); |
4990 andp(rsp, Immediate(-frame_alignment)); | 4990 andp(rsp, Immediate(-frame_alignment)); |
4991 movp(Operand(rsp, argument_slots_on_stack * kRegisterSize), kScratchRegister); | 4991 movp(Operand(rsp, argument_slots_on_stack * kRegisterSize), kScratchRegister); |
4992 } | 4992 } |
4993 | 4993 |
4994 | 4994 |
4995 void MacroAssembler::CallCFunction(ExternalReference function, | 4995 void MacroAssembler::CallCFunction(ExternalReference function, |
4996 int num_arguments) { | 4996 int num_arguments) { |
4997 LoadAddress(rax, function); | 4997 LoadAddress(rax, function); |
4998 CallCFunction(rax, num_arguments); | 4998 CallCFunction(rax, num_arguments); |
4999 } | 4999 } |
5000 | 5000 |
5001 | 5001 |
5002 void MacroAssembler::CallCFunction(Register function, int num_arguments) { | 5002 void MacroAssembler::CallCFunction(Register function, int num_arguments) { |
5003 ASSERT(has_frame()); | 5003 ASSERT(has_frame()); |
5004 // Check stack alignment. | 5004 // Check stack alignment. |
5005 if (emit_debug_code()) { | 5005 if (emit_debug_code()) { |
5006 CheckStackAlignment(); | 5006 CheckStackAlignment(); |
5007 } | 5007 } |
5008 | 5008 |
5009 call(function); | 5009 call(function); |
5010 ASSERT(OS::ActivationFrameAlignment() != 0); | 5010 ASSERT(base::OS::ActivationFrameAlignment() != 0); |
5011 ASSERT(num_arguments >= 0); | 5011 ASSERT(num_arguments >= 0); |
5012 int argument_slots_on_stack = | 5012 int argument_slots_on_stack = |
5013 ArgumentStackSlotsForCFunctionCall(num_arguments); | 5013 ArgumentStackSlotsForCFunctionCall(num_arguments); |
5014 movp(rsp, Operand(rsp, argument_slots_on_stack * kRegisterSize)); | 5014 movp(rsp, Operand(rsp, argument_slots_on_stack * kRegisterSize)); |
5015 } | 5015 } |
5016 | 5016 |
5017 | 5017 |
5018 bool AreAliased(Register r1, Register r2, Register r3, Register r4) { | 5018 bool AreAliased(Register r1, Register r2, Register r3, Register r4) { |
5019 if (r1.is(r2)) return true; | 5019 if (r1.is(r2)) return true; |
5020 if (r1.is(r3)) return true; | 5020 if (r1.is(r3)) return true; |
(...skipping 11 matching lines...) Expand all Loading... |
5032 masm_(NULL, address, size + Assembler::kGap) { | 5032 masm_(NULL, address, size + Assembler::kGap) { |
5033 // Create a new macro assembler pointing to the address of the code to patch. | 5033 // Create a new macro assembler pointing to the address of the code to patch. |
5034 // The size is adjusted with kGap on order for the assembler to generate size | 5034 // The size is adjusted with kGap on order for the assembler to generate size |
5035 // bytes of instructions without failing with buffer size constraints. | 5035 // bytes of instructions without failing with buffer size constraints. |
5036 ASSERT(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); | 5036 ASSERT(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); |
5037 } | 5037 } |
5038 | 5038 |
5039 | 5039 |
5040 CodePatcher::~CodePatcher() { | 5040 CodePatcher::~CodePatcher() { |
5041 // Indicate that code has changed. | 5041 // Indicate that code has changed. |
5042 CPU::FlushICache(address_, size_); | 5042 CpuFeatures::FlushICache(address_, size_); |
5043 | 5043 |
5044 // Check that the code was patched as expected. | 5044 // Check that the code was patched as expected. |
5045 ASSERT(masm_.pc_ == address_ + size_); | 5045 ASSERT(masm_.pc_ == address_ + size_); |
5046 ASSERT(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); | 5046 ASSERT(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); |
5047 } | 5047 } |
5048 | 5048 |
5049 | 5049 |
5050 void MacroAssembler::CheckPageFlag( | 5050 void MacroAssembler::CheckPageFlag( |
5051 Register object, | 5051 Register object, |
5052 Register scratch, | 5052 Register scratch, |
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5350 if (ms.shift() > 0) sarl(rdx, Immediate(ms.shift())); | 5350 if (ms.shift() > 0) sarl(rdx, Immediate(ms.shift())); |
5351 movl(rax, dividend); | 5351 movl(rax, dividend); |
5352 shrl(rax, Immediate(31)); | 5352 shrl(rax, Immediate(31)); |
5353 addl(rdx, rax); | 5353 addl(rdx, rax); |
5354 } | 5354 } |
5355 | 5355 |
5356 | 5356 |
5357 } } // namespace v8::internal | 5357 } } // namespace v8::internal |
5358 | 5358 |
5359 #endif // V8_TARGET_ARCH_X64 | 5359 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |