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 <limits.h> // For LONG_MIN, LONG_MAX. | 5 #include <limits.h> // For LONG_MIN, LONG_MAX. |
6 | 6 |
7 #include "src/v8.h" | 7 #include "src/v8.h" |
8 | 8 |
9 #if V8_TARGET_ARCH_MIPS | 9 #if V8_TARGET_ARCH_MIPS |
10 | 10 |
(...skipping 4693 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4704 sw(scratch1, FieldMemOperand(string, String::kHashFieldOffset)); | 4704 sw(scratch1, FieldMemOperand(string, String::kHashFieldOffset)); |
4705 } | 4705 } |
4706 | 4706 |
4707 | 4707 |
4708 int MacroAssembler::ActivationFrameAlignment() { | 4708 int MacroAssembler::ActivationFrameAlignment() { |
4709 #if V8_HOST_ARCH_MIPS | 4709 #if V8_HOST_ARCH_MIPS |
4710 // Running on the real platform. Use the alignment as mandated by the local | 4710 // Running on the real platform. Use the alignment as mandated by the local |
4711 // environment. | 4711 // environment. |
4712 // Note: This will break if we ever start generating snapshots on one Mips | 4712 // Note: This will break if we ever start generating snapshots on one Mips |
4713 // platform for another Mips platform with a different alignment. | 4713 // platform for another Mips platform with a different alignment. |
4714 return OS::ActivationFrameAlignment(); | 4714 return base::OS::ActivationFrameAlignment(); |
4715 #else // V8_HOST_ARCH_MIPS | 4715 #else // V8_HOST_ARCH_MIPS |
4716 // If we are using the simulator then we should always align to the expected | 4716 // If we are using the simulator then we should always align to the expected |
4717 // alignment. As the simulator is used to generate snapshots we do not know | 4717 // alignment. As the simulator is used to generate snapshots we do not know |
4718 // if the target platform will need alignment, so this is controlled from a | 4718 // if the target platform will need alignment, so this is controlled from a |
4719 // flag. | 4719 // flag. |
4720 return FLAG_sim_stack_alignment; | 4720 return FLAG_sim_stack_alignment; |
4721 #endif // V8_HOST_ARCH_MIPS | 4721 #endif // V8_HOST_ARCH_MIPS |
4722 } | 4722 } |
4723 | 4723 |
4724 | 4724 |
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5177 int num_double_arguments) { | 5177 int num_double_arguments) { |
5178 ASSERT(has_frame()); | 5178 ASSERT(has_frame()); |
5179 // Make sure that the stack is aligned before calling a C function unless | 5179 // Make sure that the stack is aligned before calling a C function unless |
5180 // running in the simulator. The simulator has its own alignment check which | 5180 // running in the simulator. The simulator has its own alignment check which |
5181 // provides more information. | 5181 // provides more information. |
5182 // The argument stots are presumed to have been set up by | 5182 // The argument stots are presumed to have been set up by |
5183 // PrepareCallCFunction. The C function must be called via t9, for mips ABI. | 5183 // PrepareCallCFunction. The C function must be called via t9, for mips ABI. |
5184 | 5184 |
5185 #if V8_HOST_ARCH_MIPS | 5185 #if V8_HOST_ARCH_MIPS |
5186 if (emit_debug_code()) { | 5186 if (emit_debug_code()) { |
5187 int frame_alignment = OS::ActivationFrameAlignment(); | 5187 int frame_alignment = base::OS::ActivationFrameAlignment(); |
5188 int frame_alignment_mask = frame_alignment - 1; | 5188 int frame_alignment_mask = frame_alignment - 1; |
5189 if (frame_alignment > kPointerSize) { | 5189 if (frame_alignment > kPointerSize) { |
5190 ASSERT(IsPowerOf2(frame_alignment)); | 5190 ASSERT(IsPowerOf2(frame_alignment)); |
5191 Label alignment_as_expected; | 5191 Label alignment_as_expected; |
5192 And(at, sp, Operand(frame_alignment_mask)); | 5192 And(at, sp, Operand(frame_alignment_mask)); |
5193 Branch(&alignment_as_expected, eq, at, Operand(zero_reg)); | 5193 Branch(&alignment_as_expected, eq, at, Operand(zero_reg)); |
5194 // Don't use Check here, as it will call Runtime_Abort possibly | 5194 // Don't use Check here, as it will call Runtime_Abort possibly |
5195 // re-entering here. | 5195 // re-entering here. |
5196 stop("Unexpected alignment in CallCFunction"); | 5196 stop("Unexpected alignment in CallCFunction"); |
5197 bind(&alignment_as_expected); | 5197 bind(&alignment_as_expected); |
5198 } | 5198 } |
5199 } | 5199 } |
5200 #endif // V8_HOST_ARCH_MIPS | 5200 #endif // V8_HOST_ARCH_MIPS |
5201 | 5201 |
5202 // Just call directly. The function called cannot cause a GC, or | 5202 // Just call directly. The function called cannot cause a GC, or |
5203 // allow preemption, so the return address in the link register | 5203 // allow preemption, so the return address in the link register |
5204 // stays correct. | 5204 // stays correct. |
5205 | 5205 |
5206 if (!function.is(t9)) { | 5206 if (!function.is(t9)) { |
5207 mov(t9, function); | 5207 mov(t9, function); |
5208 function = t9; | 5208 function = t9; |
5209 } | 5209 } |
5210 | 5210 |
5211 Call(function); | 5211 Call(function); |
5212 | 5212 |
5213 int stack_passed_arguments = CalculateStackPassedWords( | 5213 int stack_passed_arguments = CalculateStackPassedWords( |
5214 num_reg_arguments, num_double_arguments); | 5214 num_reg_arguments, num_double_arguments); |
5215 | 5215 |
5216 if (OS::ActivationFrameAlignment() > kPointerSize) { | 5216 if (base::OS::ActivationFrameAlignment() > kPointerSize) { |
5217 lw(sp, MemOperand(sp, stack_passed_arguments * kPointerSize)); | 5217 lw(sp, MemOperand(sp, stack_passed_arguments * kPointerSize)); |
5218 } else { | 5218 } else { |
5219 Addu(sp, sp, Operand(stack_passed_arguments * sizeof(kPointerSize))); | 5219 Addu(sp, sp, Operand(stack_passed_arguments * sizeof(kPointerSize))); |
5220 } | 5220 } |
5221 } | 5221 } |
5222 | 5222 |
5223 | 5223 |
5224 #undef BRANCH_ARGS_CHECK | 5224 #undef BRANCH_ARGS_CHECK |
5225 | 5225 |
5226 | 5226 |
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5690 // Create a new macro assembler pointing to the address of the code to patch. | 5690 // Create a new macro assembler pointing to the address of the code to patch. |
5691 // The size is adjusted with kGap on order for the assembler to generate size | 5691 // The size is adjusted with kGap on order for the assembler to generate size |
5692 // bytes of instructions without failing with buffer size constraints. | 5692 // bytes of instructions without failing with buffer size constraints. |
5693 ASSERT(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); | 5693 ASSERT(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); |
5694 } | 5694 } |
5695 | 5695 |
5696 | 5696 |
5697 CodePatcher::~CodePatcher() { | 5697 CodePatcher::~CodePatcher() { |
5698 // Indicate that code has changed. | 5698 // Indicate that code has changed. |
5699 if (flush_cache_ == FLUSH) { | 5699 if (flush_cache_ == FLUSH) { |
5700 CPU::FlushICache(address_, size_); | 5700 CpuFeatures::FlushICache(address_, size_); |
5701 } | 5701 } |
5702 | 5702 |
5703 // Check that the code was patched as expected. | 5703 // Check that the code was patched as expected. |
5704 ASSERT(masm_.pc_ == address_ + size_); | 5704 ASSERT(masm_.pc_ == address_ + size_); |
5705 ASSERT(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); | 5705 ASSERT(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); |
5706 } | 5706 } |
5707 | 5707 |
5708 | 5708 |
5709 void CodePatcher::Emit(Instr instr) { | 5709 void CodePatcher::Emit(Instr instr) { |
5710 masm()->emit(instr); | 5710 masm()->emit(instr); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5756 } | 5756 } |
5757 if (ms.shift() > 0) sra(result, result, ms.shift()); | 5757 if (ms.shift() > 0) sra(result, result, ms.shift()); |
5758 srl(at, dividend, 31); | 5758 srl(at, dividend, 31); |
5759 Addu(result, result, Operand(at)); | 5759 Addu(result, result, Operand(at)); |
5760 } | 5760 } |
5761 | 5761 |
5762 | 5762 |
5763 } } // namespace v8::internal | 5763 } } // namespace v8::internal |
5764 | 5764 |
5765 #endif // V8_TARGET_ARCH_MIPS | 5765 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |