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