1fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org 25c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Copyright (c) 1994-2006 Sun Microsystems Inc. 35c838251403b0be9a882540f1922577abba4c872ager@chromium.org// All Rights Reserved. 45c838251403b0be9a882540f1922577abba4c872ager@chromium.org// 55c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Redistribution and use in source and binary forms, with or without 65c838251403b0be9a882540f1922577abba4c872ager@chromium.org// modification, are permitted provided that the following conditions are 75c838251403b0be9a882540f1922577abba4c872ager@chromium.org// met: 85c838251403b0be9a882540f1922577abba4c872ager@chromium.org// 95c838251403b0be9a882540f1922577abba4c872ager@chromium.org// - Redistributions of source code must retain the above copyright notice, 105c838251403b0be9a882540f1922577abba4c872ager@chromium.org// this list of conditions and the following disclaimer. 115c838251403b0be9a882540f1922577abba4c872ager@chromium.org// 125c838251403b0be9a882540f1922577abba4c872ager@chromium.org// - Redistribution in binary form must reproduce the above copyright 135c838251403b0be9a882540f1922577abba4c872ager@chromium.org// notice, this list of conditions and the following disclaimer in the 145c838251403b0be9a882540f1922577abba4c872ager@chromium.org// documentation and/or other materials provided with the distribution. 155c838251403b0be9a882540f1922577abba4c872ager@chromium.org// 165c838251403b0be9a882540f1922577abba4c872ager@chromium.org// - Neither the name of Sun Microsystems or the names of contributors may 175c838251403b0be9a882540f1922577abba4c872ager@chromium.org// be used to endorse or promote products derived from this software without 185c838251403b0be9a882540f1922577abba4c872ager@chromium.org// specific prior written permission. 195c838251403b0be9a882540f1922577abba4c872ager@chromium.org// 205c838251403b0be9a882540f1922577abba4c872ager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 215c838251403b0be9a882540f1922577abba4c872ager@chromium.org// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 225c838251403b0be9a882540f1922577abba4c872ager@chromium.org// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 235c838251403b0be9a882540f1922577abba4c872ager@chromium.org// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 245c838251403b0be9a882540f1922577abba4c872ager@chromium.org// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 255c838251403b0be9a882540f1922577abba4c872ager@chromium.org// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 265c838251403b0be9a882540f1922577abba4c872ager@chromium.org// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 275c838251403b0be9a882540f1922577abba4c872ager@chromium.org// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 285c838251403b0be9a882540f1922577abba4c872ager@chromium.org// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 295c838251403b0be9a882540f1922577abba4c872ager@chromium.org// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 305c838251403b0be9a882540f1922577abba4c872ager@chromium.org// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 315c838251403b0be9a882540f1922577abba4c872ager@chromium.org 325c838251403b0be9a882540f1922577abba4c872ager@chromium.org// The original source code covered by the above license above has been 335c838251403b0be9a882540f1922577abba4c872ager@chromium.org// modified significantly by Google Inc. 342efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 355c838251403b0be9a882540f1922577abba4c872ager@chromium.org 365c838251403b0be9a882540f1922577abba4c872ager@chromium.org 375c838251403b0be9a882540f1922577abba4c872ager@chromium.org#ifndef V8_MIPS_ASSEMBLER_MIPS_INL_H_ 385c838251403b0be9a882540f1922577abba4c872ager@chromium.org#define V8_MIPS_ASSEMBLER_MIPS_INL_H_ 395c838251403b0be9a882540f1922577abba4c872ager@chromium.org 40196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/mips/assembler-mips.h" 41659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org 425de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/assembler.h" 43196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/debug.h" 445c838251403b0be9a882540f1922577abba4c872ager@chromium.org 455c838251403b0be9a882540f1922577abba4c872ager@chromium.org 465c838251403b0be9a882540f1922577abba4c872ager@chromium.orgnamespace v8 { 475c838251403b0be9a882540f1922577abba4c872ager@chromium.orgnamespace internal { 485c838251403b0be9a882540f1922577abba4c872ager@chromium.org 49874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org 50874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.orgbool CpuFeatures::SupportsCrankshaft() { return IsSupported(FPU); } 51874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org 52874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org 535c838251403b0be9a882540f1922577abba4c872ager@chromium.org// ----------------------------------------------------------------------------- 5483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org// Operand and MemOperand. 555c838251403b0be9a882540f1922577abba4c872ager@chromium.org 565c838251403b0be9a882540f1922577abba4c872ager@chromium.orgOperand::Operand(int32_t immediate, RelocInfo::Mode rmode) { 575c838251403b0be9a882540f1922577abba4c872ager@chromium.org rm_ = no_reg; 585c838251403b0be9a882540f1922577abba4c872ager@chromium.org imm32_ = immediate; 595c838251403b0be9a882540f1922577abba4c872ager@chromium.org rmode_ = rmode; 605c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 615c838251403b0be9a882540f1922577abba4c872ager@chromium.org 627516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 635c838251403b0be9a882540f1922577abba4c872ager@chromium.orgOperand::Operand(const ExternalReference& f) { 645c838251403b0be9a882540f1922577abba4c872ager@chromium.org rm_ = no_reg; 655c838251403b0be9a882540f1922577abba4c872ager@chromium.org imm32_ = reinterpret_cast<int32_t>(f.address()); 665c838251403b0be9a882540f1922577abba4c872ager@chromium.org rmode_ = RelocInfo::EXTERNAL_REFERENCE; 675c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 685c838251403b0be9a882540f1922577abba4c872ager@chromium.org 695c838251403b0be9a882540f1922577abba4c872ager@chromium.org 705c838251403b0be9a882540f1922577abba4c872ager@chromium.orgOperand::Operand(Smi* value) { 715c838251403b0be9a882540f1922577abba4c872ager@chromium.org rm_ = no_reg; 725c838251403b0be9a882540f1922577abba4c872ager@chromium.org imm32_ = reinterpret_cast<intptr_t>(value); 7359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org rmode_ = RelocInfo::NONE32; 745c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 755c838251403b0be9a882540f1922577abba4c872ager@chromium.org 767516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 775c838251403b0be9a882540f1922577abba4c872ager@chromium.orgOperand::Operand(Register rm) { 785c838251403b0be9a882540f1922577abba4c872ager@chromium.org rm_ = rm; 795c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 805c838251403b0be9a882540f1922577abba4c872ager@chromium.org 817516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 825c838251403b0be9a882540f1922577abba4c872ager@chromium.orgbool Operand::is_reg() const { 835c838251403b0be9a882540f1922577abba4c872ager@chromium.org return rm_.is_valid(); 845c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 855c838251403b0be9a882540f1922577abba4c872ager@chromium.org 865c838251403b0be9a882540f1922577abba4c872ager@chromium.org 8759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgint Register::NumAllocatableRegisters() { 8859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return kMaxNumAllocatableRegisters; 8959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org} 9059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 9159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 9259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgint DoubleRegister::NumRegisters() { 937c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org return FPURegister::kMaxNumRegisters; 9459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org} 9559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 9659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 9759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgint DoubleRegister::NumAllocatableRegisters() { 9859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return FPURegister::kMaxNumAllocatableRegisters; 9959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org} 10059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 10159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 1022efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.orgint FPURegister::ToAllocationIndex(FPURegister reg) { 103e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(reg.code() % 2 == 0); 104e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(reg.code() / 2 < kMaxNumAllocatableRegisters); 105e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(reg.is_valid()); 106e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!reg.is(kDoubleRegZero)); 107e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!reg.is(kLithiumScratchDouble)); 1082efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org return (reg.code() / 2); 1092efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org} 1102efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org 1112efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org 1125c838251403b0be9a882540f1922577abba4c872ager@chromium.org// ----------------------------------------------------------------------------- 11383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org// RelocInfo. 1145c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1156a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.orgvoid RelocInfo::apply(intptr_t delta, ICacheFlushMode icache_flush_mode) { 11634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org if (IsCodeTarget(rmode_)) { 11734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org uint32_t scope1 = (uint32_t) target_address() & ~kImm28Mask; 11834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org uint32_t scope2 = reinterpret_cast<uint32_t>(pc_) & ~kImm28Mask; 11934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 12034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org if (scope1 != scope2) { 12134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org Assembler::JumpLabelToJumpRegister(pc_); 12234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org } 12334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org } 1243cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org if (IsInternalReference(rmode_)) { 1253cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org // Absolute code pointer inside code object moves with the code object. 1263cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org byte* p = reinterpret_cast<byte*>(pc_); 1273cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org int count = Assembler::RelocateInternalReference(p, delta); 1285de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org CpuFeatures::FlushICache(p, count * sizeof(uint32_t)); 1293cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org } 1305c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 1315c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1325c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1335c838251403b0be9a882540f1922577abba4c872ager@chromium.orgAddress RelocInfo::target_address() { 134e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)); 13597b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org return Assembler::target_address_at(pc_, host_); 1365c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 1375c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1385c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1395c838251403b0be9a882540f1922577abba4c872ager@chromium.orgAddress RelocInfo::target_address_address() { 140e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsCodeTarget(rmode_) || 1412bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org IsRuntimeEntry(rmode_) || 14288aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org rmode_ == EMBEDDED_OBJECT || 14388aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org rmode_ == EXTERNAL_REFERENCE); 14488aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org // Read the address of the word containing the target_address in an 14588aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org // instruction stream. 14688aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org // The only architecture-independent user of this function is the serializer. 14788aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org // The serializer uses it to find out how many raw bytes of instruction to 14888aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org // output before the next target. 14988aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org // For an instruction like LUI/ORI where the target bits are mixed into the 15088aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org // instruction bits, the size of the target will be zero, indicating that the 15188aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org // serializer should not step forward in memory after a target is resolved 15288aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org // and written. In this case the target_address_address function should 15388aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org // return the end of the instructions to be patched, allowing the 15488aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org // deserializer to deserialize the instructions as raw bytes and put them in 15588aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org // place, ready to be patched with the target. After jump optimization, 15688aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org // that is the address of the instruction that follows J/JAL/JR/JALR 15788aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org // instruction. 15888aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org return reinterpret_cast<Address>( 15988aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org pc_ + Assembler::kInstructionsFor32BitConstant * Assembler::kInstrSize); 1607516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org} 1617516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 1627516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 163bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgAddress RelocInfo::constant_pool_entry_address() { 164bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org UNREACHABLE(); 165bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return NULL; 166bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org} 167bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 168bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 1697516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgint RelocInfo::target_address_size() { 17088aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org return Assembler::kSpecialTargetSize; 1715c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 1725c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1735c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1746a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.orgvoid RelocInfo::set_target_address(Address target, 1756a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org WriteBarrierMode write_barrier_mode, 1766a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org ICacheFlushMode icache_flush_mode) { 177e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)); 1786a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org Assembler::set_target_address_at(pc_, host_, target, icache_flush_mode); 1796a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org if (write_barrier_mode == UPDATE_WRITE_BARRIER && 1806a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org host() != NULL && IsCodeTarget(rmode_)) { 181b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org Object* target_code = Code::GetCodeFromTargetAddress(target); 182b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( 183b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org host(), this, HeapObject::cast(target_code)); 184b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org } 1855c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 1865c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1875c838251403b0be9a882540f1922577abba4c872ager@chromium.org 18889e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.orgAddress Assembler::target_address_from_return_address(Address pc) { 18989e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org return pc - kCallTargetAddressOffset; 19089e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org} 19189e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org 19289e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org 1939d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgAddress Assembler::break_address_from_return_address(Address pc) { 1949d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org return pc - Assembler::kPatchDebugBreakSlotReturnOffset; 1959d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org} 1969d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 1979d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 1985c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject* RelocInfo::target_object() { 199e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); 20097b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org return reinterpret_cast<Object*>(Assembler::target_address_at(pc_, host_)); 2015c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 2025c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2035c838251403b0be9a882540f1922577abba4c872ager@chromium.org 204f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comHandle<Object> RelocInfo::target_object_handle(Assembler* origin) { 205e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); 2065c838251403b0be9a882540f1922577abba4c872ager@chromium.org return Handle<Object>(reinterpret_cast<Object**>( 20797b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org Assembler::target_address_at(pc_, host_))); 2085c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 2095c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2105c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2116a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.orgvoid RelocInfo::set_target_object(Object* target, 2126a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org WriteBarrierMode write_barrier_mode, 2136a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org ICacheFlushMode icache_flush_mode) { 214e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); 21597b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org Assembler::set_target_address_at(pc_, host_, 2166a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org reinterpret_cast<Address>(target), 2176a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org icache_flush_mode); 2186a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org if (write_barrier_mode == UPDATE_WRITE_BARRIER && 219394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com host() != NULL && 220394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com target->IsHeapObject()) { 221b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org host()->GetHeap()->incremental_marking()->RecordWrite( 222b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org host(), &Memory::Object_at(pc_), HeapObject::cast(target)); 223b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org } 2245c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 2255c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2265c838251403b0be9a882540f1922577abba4c872ager@chromium.org 227057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgAddress RelocInfo::target_reference() { 228e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(rmode_ == EXTERNAL_REFERENCE); 22997b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org return Assembler::target_address_at(pc_, host_); 2307516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org} 2317516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 2327516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 2336e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.orgAddress RelocInfo::target_runtime_entry(Assembler* origin) { 234e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsRuntimeEntry(rmode_)); 2356e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org return target_address(); 2366e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org} 2376e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 2386e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 2396e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.orgvoid RelocInfo::set_target_runtime_entry(Address target, 2406a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org WriteBarrierMode write_barrier_mode, 2416a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org ICacheFlushMode icache_flush_mode) { 242e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsRuntimeEntry(rmode_)); 2436a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org if (target_address() != target) 2446a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org set_target_address(target, write_barrier_mode, icache_flush_mode); 2456e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org} 2466e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 2476e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 248f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.orgHandle<Cell> RelocInfo::target_cell_handle() { 249e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(rmode_ == RelocInfo::CELL); 2507516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org Address address = Memory::Address_at(pc_); 251f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org return Handle<Cell>(reinterpret_cast<Cell**>(address)); 2527516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org} 2537516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 2547516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 255f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.orgCell* RelocInfo::target_cell() { 256e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(rmode_ == RelocInfo::CELL); 257f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org return Cell::FromValueAddress(Memory::Address_at(pc_)); 2587516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org} 2597516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 2607516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 2616a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.orgvoid RelocInfo::set_target_cell(Cell* cell, 2626a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org WriteBarrierMode write_barrier_mode, 2636a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org ICacheFlushMode icache_flush_mode) { 264e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(rmode_ == RelocInfo::CELL); 265f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org Address address = cell->address() + Cell::kValueOffset; 2667516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org Memory::Address_at(pc_) = address; 2676a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL) { 268b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // TODO(1550) We are passing NULL as a slot because cell can never be on 269b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // evacuation candidate. 270b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org host()->GetHeap()->incremental_marking()->RecordWrite( 271b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org host(), NULL, cell); 272b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org } 2735c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 2745c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2755c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2765924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.orgstatic const int kNoCodeAgeSequenceLength = 7 * Assembler::kInstrSize; 277fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org 278c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org 279c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.orgHandle<Object> RelocInfo::code_age_stub_handle(Assembler* origin) { 280c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org UNREACHABLE(); // This should never be reached on Arm. 281c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org return Handle<Object>(); 282c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org} 283c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org 284c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org 285fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgCode* RelocInfo::code_age_stub() { 286e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); 287fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org return Code::GetCodeFromTargetAddress( 28897b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org Assembler::target_address_at(pc_ + Assembler::kInstrSize, host_)); 289fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org} 290fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org 291fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org 2926a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.orgvoid RelocInfo::set_code_age_stub(Code* stub, 2936a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org ICacheFlushMode icache_flush_mode) { 294e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); 295f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Assembler::set_target_address_at(pc_ + Assembler::kInstrSize, 29697b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org host_, 297f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org stub->instruction_start()); 298fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org} 299fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org 300fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org 3015c838251403b0be9a882540f1922577abba4c872ager@chromium.orgAddress RelocInfo::call_address() { 302e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || 3037516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); 3047516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org // The pc_ offset of 0 assumes mips patched return sequence per 3057516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org // debug-mips.cc BreakLocationIterator::SetDebugBreakAtReturn(), or 3067516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org // debug break slot per BreakLocationIterator::SetDebugBreakAtSlot(). 30797b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org return Assembler::target_address_at(pc_, host_); 3085c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 3095c838251403b0be9a882540f1922577abba4c872ager@chromium.org 3105c838251403b0be9a882540f1922577abba4c872ager@chromium.org 3115c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvoid RelocInfo::set_call_address(Address target) { 312e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || 3137516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); 3147516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org // The pc_ offset of 0 assumes mips patched return sequence per 3157516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org // debug-mips.cc BreakLocationIterator::SetDebugBreakAtReturn(), or 3167516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org // debug break slot per BreakLocationIterator::SetDebugBreakAtSlot(). 31797b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org Assembler::set_target_address_at(pc_, host_, target); 318b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org if (host() != NULL) { 319b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org Object* target_code = Code::GetCodeFromTargetAddress(target); 320b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( 321b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org host(), this, HeapObject::cast(target_code)); 322b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org } 3235c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 3245c838251403b0be9a882540f1922577abba4c872ager@chromium.org 3255c838251403b0be9a882540f1922577abba4c872ager@chromium.org 3265c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject* RelocInfo::call_object() { 3275c838251403b0be9a882540f1922577abba4c872ager@chromium.org return *call_object_address(); 3285c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 3295c838251403b0be9a882540f1922577abba4c872ager@chromium.org 3305c838251403b0be9a882540f1922577abba4c872ager@chromium.org 3315c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject** RelocInfo::call_object_address() { 332e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || 3337516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); 3345c838251403b0be9a882540f1922577abba4c872ager@chromium.org return reinterpret_cast<Object**>(pc_ + 2 * Assembler::kInstrSize); 3355c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 3365c838251403b0be9a882540f1922577abba4c872ager@chromium.org 3375c838251403b0be9a882540f1922577abba4c872ager@chromium.org 3385c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvoid RelocInfo::set_call_object(Object* target) { 3395c838251403b0be9a882540f1922577abba4c872ager@chromium.org *call_object_address() = target; 3405c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 3415c838251403b0be9a882540f1922577abba4c872ager@chromium.org 3425c838251403b0be9a882540f1922577abba4c872ager@chromium.org 343057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgvoid RelocInfo::WipeOut() { 344e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsEmbeddedObject(rmode_) || 345057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org IsCodeTarget(rmode_) || 346057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org IsRuntimeEntry(rmode_) || 347057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org IsExternalReference(rmode_)); 34897b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org Assembler::set_target_address_at(pc_, host_, NULL); 349057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org} 350057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 351057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 3525c838251403b0be9a882540f1922577abba4c872ager@chromium.orgbool RelocInfo::IsPatchedReturnSequence() { 3537516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org Instr instr0 = Assembler::instr_at(pc_); 3547516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org Instr instr1 = Assembler::instr_at(pc_ + 1 * Assembler::kInstrSize); 3557516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org Instr instr2 = Assembler::instr_at(pc_ + 2 * Assembler::kInstrSize); 3567516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org bool patched_return = ((instr0 & kOpcodeMask) == LUI && 3577516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org (instr1 & kOpcodeMask) == ORI && 35834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org ((instr2 & kOpcodeMask) == JAL || 35934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org ((instr2 & kOpcodeMask) == SPECIAL && 36034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org (instr2 & kFunctionFieldMask) == JALR))); 3617516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org return patched_return; 3627516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org} 3637516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 3647516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 3657516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgbool RelocInfo::IsPatchedDebugBreakSlotSequence() { 3667516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org Instr current_instr = Assembler::instr_at(pc_); 3677516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org return !Assembler::IsNop(current_instr, Assembler::DEBUG_BREAK_NOP); 3687516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org} 3697516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 3707516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 371e97852de34e44a479f092bd2449134e707cd9cf1dslomov@chromium.orgvoid RelocInfo::Visit(Isolate* isolate, ObjectVisitor* visitor) { 3727516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org RelocInfo::Mode mode = rmode(); 3737516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org if (mode == RelocInfo::EMBEDDED_OBJECT) { 374b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org visitor->VisitEmbeddedPointer(this); 3757516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org } else if (RelocInfo::IsCodeTarget(mode)) { 3767516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org visitor->VisitCodeTarget(this); 377f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org } else if (mode == RelocInfo::CELL) { 378f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org visitor->VisitCell(this); 3797516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { 38088aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org visitor->VisitExternalReference(this); 381fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org } else if (RelocInfo::IsCodeAgeSequence(mode)) { 382fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org visitor->VisitCodeAgeSequence(this); 3837516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org } else if (((RelocInfo::IsJSReturn(mode) && 384b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org IsPatchedReturnSequence()) || 385b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org (RelocInfo::IsDebugBreakSlot(mode) && 386b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org IsPatchedDebugBreakSlotSequence())) && 387e97852de34e44a479f092bd2449134e707cd9cf1dslomov@chromium.org isolate->debug()->has_break_points()) { 3887516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org visitor->VisitDebugTarget(this); 3892bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org } else if (RelocInfo::IsRuntimeEntry(mode)) { 3907516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org visitor->VisitRuntimeEntry(this); 3917516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org } 3927516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org} 3937516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 3947516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 3957516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgtemplate<typename StaticVisitor> 3967516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgvoid RelocInfo::Visit(Heap* heap) { 3977516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org RelocInfo::Mode mode = rmode(); 3987516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org if (mode == RelocInfo::EMBEDDED_OBJECT) { 399b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org StaticVisitor::VisitEmbeddedPointer(heap, this); 4007516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org } else if (RelocInfo::IsCodeTarget(mode)) { 40183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org StaticVisitor::VisitCodeTarget(heap, this); 402f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org } else if (mode == RelocInfo::CELL) { 403f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org StaticVisitor::VisitCell(heap, this); 4047516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { 40588aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org StaticVisitor::VisitExternalReference(this); 406fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org } else if (RelocInfo::IsCodeAgeSequence(mode)) { 407fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org StaticVisitor::VisitCodeAgeSequence(heap, this); 4087516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org } else if (heap->isolate()->debug()->has_break_points() && 4097516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org ((RelocInfo::IsJSReturn(mode) && 4107516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org IsPatchedReturnSequence()) || 4117516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org (RelocInfo::IsDebugBreakSlot(mode) && 4127516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org IsPatchedDebugBreakSlotSequence()))) { 41383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org StaticVisitor::VisitDebugTarget(heap, this); 4142bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org } else if (RelocInfo::IsRuntimeEntry(mode)) { 4157516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org StaticVisitor::VisitRuntimeEntry(this); 4167516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org } 4175c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 4185c838251403b0be9a882540f1922577abba4c872ager@chromium.org 4195c838251403b0be9a882540f1922577abba4c872ager@chromium.org 4205c838251403b0be9a882540f1922577abba4c872ager@chromium.org// ----------------------------------------------------------------------------- 42183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org// Assembler. 4225c838251403b0be9a882540f1922577abba4c872ager@chromium.org 4235c838251403b0be9a882540f1922577abba4c872ager@chromium.org 4245c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvoid Assembler::CheckBuffer() { 4255c838251403b0be9a882540f1922577abba4c872ager@chromium.org if (buffer_space() <= kGap) { 4265c838251403b0be9a882540f1922577abba4c872ager@chromium.org GrowBuffer(); 4275c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 4285c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 4295c838251403b0be9a882540f1922577abba4c872ager@chromium.org 4305c838251403b0be9a882540f1922577abba4c872ager@chromium.org 4317516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgvoid Assembler::CheckTrampolinePoolQuick() { 4327516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org if (pc_offset() >= next_buffer_check_) { 4337516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org CheckTrampolinePool(); 4347516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org } 4357516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org} 4367516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 4377516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 4385c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvoid Assembler::emit(Instr x) { 4393cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org if (!is_buffer_growth_blocked()) { 4403cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org CheckBuffer(); 4413cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org } 4425c838251403b0be9a882540f1922577abba4c872ager@chromium.org *reinterpret_cast<Instr*>(pc_) = x; 4435c838251403b0be9a882540f1922577abba4c872ager@chromium.org pc_ += kInstrSize; 4447516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org CheckTrampolinePoolQuick(); 4455c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 4465c838251403b0be9a882540f1922577abba4c872ager@chromium.org 4475c838251403b0be9a882540f1922577abba4c872ager@chromium.org 4485c838251403b0be9a882540f1922577abba4c872ager@chromium.org} } // namespace v8::internal 4495c838251403b0be9a882540f1922577abba4c872ager@chromium.org 4505c838251403b0be9a882540f1922577abba4c872ager@chromium.org#endif // V8_MIPS_ASSEMBLER_MIPS_INL_H_ 451