143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Copyright (c) 1994-2006 Sun Microsystems Inc.
243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// All Rights Reserved.
343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Redistribution and use in source and binary forms, with or without
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// modification, are permitted provided that the following conditions are
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// met:
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// - Redistributions of source code must retain the above copyright notice,
943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// this list of conditions and the following disclaimer.
1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// - Redistribution in binary form must reproduce the above copyright
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// notice, this list of conditions and the following disclaimer in the
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// documentation and/or other materials provided with the distribution.
1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// - Neither the name of Sun Microsystems or the names of contributors may
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// be used to endorse or promote products derived from this software without
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// specific prior written permission.
1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The original source code covered by the above license above has been
3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// modified significantly by Google Inc.
33659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A light-weight IA32 Assembler.
3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
375ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#ifndef V8_IA32_ASSEMBLER_IA32_INL_H_
385ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#define V8_IA32_ASSEMBLER_IA32_INL_H_
3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
40196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/ia32/assembler-ia32.h"
41659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
425de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/assembler.h"
43196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/debug.h"
4443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
4671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.orgbool CpuFeatures::SupportsCrankshaft() { return true; }
49874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org
5043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
51e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgstatic const byte kCallOpcode = 0xE8;
52c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.orgstatic const int kNoCodeAgeSequenceLength = 5;
53e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
54e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
5543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The modes possibly affected by apply must be in kApplyMask.
566a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.orgvoid RelocInfo::apply(intptr_t delta, ICacheFlushMode icache_flush_mode) {
576a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  bool flush_icache = icache_flush_mode != SKIP_ICACHE_FLUSH;
586e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  if (IsRuntimeEntry(rmode_) || IsCodeTarget(rmode_)) {
5943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    int32_t* p = reinterpret_cast<int32_t*>(pc_);
602356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org    *p -= delta;  // Relocate entry.
615de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org    if (flush_icache) CpuFeatures::FlushICache(p, sizeof(uint32_t));
62e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  } else if (rmode_ == CODE_AGE_SEQUENCE) {
63e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    if (*pc_ == kCallOpcode) {
64e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org      int32_t* p = reinterpret_cast<int32_t*>(pc_ + 1);
65e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org      *p -= delta;  // Relocate entry.
665de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org    if (flush_icache) CpuFeatures::FlushICache(p, sizeof(uint32_t));
67e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    }
689d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  } else if (rmode_ == JS_RETURN && IsPatchedReturnSequence()) {
6943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Special handling of js_return when a break point is set (call
7043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // instruction has been inserted).
7143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    int32_t* p = reinterpret_cast<int32_t*>(pc_ + 1);
722356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org    *p -= delta;  // Relocate entry.
735de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org    if (flush_icache) CpuFeatures::FlushICache(p, sizeof(uint32_t));
742356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  } else if (rmode_ == DEBUG_BREAK_SLOT && IsPatchedDebugBreakSlotSequence()) {
752356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org    // Special handling of a debug break slot when a break point is set (call
762356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org    // instruction has been inserted).
772356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org    int32_t* p = reinterpret_cast<int32_t*>(pc_ + 1);
782356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org    *p -= delta;  // Relocate entry.
795de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org    if (flush_icache) CpuFeatures::FlushICache(p, sizeof(uint32_t));
80236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org  } else if (IsInternalReference(rmode_)) {
81236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org    // absolute code pointer inside code object moves with the code object.
82236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org    int32_t* p = reinterpret_cast<int32_t*>(pc_);
832356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org    *p += delta;  // Relocate entry.
845de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org    if (flush_icache) CpuFeatures::FlushICache(p, sizeof(uint32_t));
8543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
8643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
8743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenAddress RelocInfo::target_address() {
90e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_));
9197b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org  return Assembler::target_address_at(pc_, host_);
9243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
9343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
953291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgAddress RelocInfo::target_address_address() {
96e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)
9704e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org                              || rmode_ == EMBEDDED_OBJECT
9804e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org                              || rmode_ == EXTERNAL_REFERENCE);
993291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return reinterpret_cast<Address>(pc_);
1003291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
1013291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
1023291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
103bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgAddress RelocInfo::constant_pool_entry_address() {
104bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  UNREACHABLE();
105bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  return NULL;
106bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org}
107bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
108bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
1099155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgint RelocInfo::target_address_size() {
11088aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  return Assembler::kSpecialTargetSize;
1119155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org}
1129155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
1139155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
1146a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.orgvoid RelocInfo::set_target_address(Address target,
1156a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org                                   WriteBarrierMode write_barrier_mode,
1166a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org                                   ICacheFlushMode icache_flush_mode) {
1176a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  Assembler::set_target_address_at(pc_, host_, target, icache_flush_mode);
118e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_));
1196a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL &&
1206a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org      IsCodeTarget(rmode_)) {
121c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    Object* target_code = Code::GetCodeFromTargetAddress(target);
122c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(
123c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        host(), this, HeapObject::cast(target_code));
124c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
12543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenObject* RelocInfo::target_object() {
129e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT);
130c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  return Memory::Object_at(pc_);
131c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org}
132c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
133c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
134c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgHandle<Object> RelocInfo::target_object_handle(Assembler* origin) {
135e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT);
136c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  return Memory::Object_Handle_at(pc_);
13743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
13843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1406a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.orgvoid RelocInfo::set_target_object(Object* target,
1416a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org                                  WriteBarrierMode write_barrier_mode,
1426a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org                                  ICacheFlushMode icache_flush_mode) {
143e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT);
144c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  Memory::Object_at(pc_) = target;
1456a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  if (icache_flush_mode != SKIP_ICACHE_FLUSH) {
1465de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org    CpuFeatures::FlushICache(pc_, sizeof(Address));
1476a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  }
1486a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  if (write_barrier_mode == UPDATE_WRITE_BARRIER &&
149394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com      host() != NULL &&
150394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com      target->IsHeapObject()) {
151c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    host()->GetHeap()->incremental_marking()->RecordWrite(
152c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        host(), &Memory::Object_at(pc_), HeapObject::cast(target));
153c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
15443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
15543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
157057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgAddress RelocInfo::target_reference() {
158e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(rmode_ == RelocInfo::EXTERNAL_REFERENCE);
159057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  return Memory::Address_at(pc_);
16043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
16143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1636e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.orgAddress RelocInfo::target_runtime_entry(Assembler* origin) {
164e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(IsRuntimeEntry(rmode_));
1656e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  return reinterpret_cast<Address>(*reinterpret_cast<int32_t*>(pc_));
1666e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org}
1676e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org
1686e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org
1696e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.orgvoid RelocInfo::set_target_runtime_entry(Address target,
1706a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org                                         WriteBarrierMode write_barrier_mode,
1716a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org                                         ICacheFlushMode icache_flush_mode) {
172e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(IsRuntimeEntry(rmode_));
1736a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  if (target_address() != target) {
1746a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org    set_target_address(target, write_barrier_mode, icache_flush_mode);
1756a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  }
1766e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org}
1776e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org
1786e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org
17941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgHandle<Cell> RelocInfo::target_cell_handle() {
180e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(rmode_ == RelocInfo::CELL);
181a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Address address = Memory::Address_at(pc_);
18241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  return Handle<Cell>(reinterpret_cast<Cell**>(address));
183a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
184a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
185a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
18641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgCell* RelocInfo::target_cell() {
187e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(rmode_ == RelocInfo::CELL);
18841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  return Cell::FromValueAddress(Memory::Address_at(pc_));
189a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
190a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
191a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1926a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.orgvoid RelocInfo::set_target_cell(Cell* cell,
1936a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org                                WriteBarrierMode write_barrier_mode,
1946a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org                                ICacheFlushMode icache_flush_mode) {
195e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(rmode_ == RelocInfo::CELL);
19641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  Address address = cell->address() + Cell::kValueOffset;
197a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Memory::Address_at(pc_) = address;
1986a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  if (icache_flush_mode != SKIP_ICACHE_FLUSH) {
1995de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org    CpuFeatures::FlushICache(pc_, sizeof(Address));
2006a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  }
2016a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL) {
202c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    // TODO(1550) We are passing NULL as a slot because cell can never be on
203c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    // evacuation candidate.
204c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    host()->GetHeap()->incremental_marking()->RecordWrite(
205c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        host(), NULL, cell);
206c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
207a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
208a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
209a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
210c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.orgHandle<Object> RelocInfo::code_age_stub_handle(Assembler* origin) {
211e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE);
212e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(*pc_ == kCallOpcode);
213c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  return Memory::Object_Handle_at(pc_ + 1);
214c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org}
215c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org
216c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org
217e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgCode* RelocInfo::code_age_stub() {
218e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE);
219e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(*pc_ == kCallOpcode);
220e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  return Code::GetCodeFromTargetAddress(
22197b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org      Assembler::target_address_at(pc_ + 1, host_));
222e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org}
223e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
224e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
2256a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.orgvoid RelocInfo::set_code_age_stub(Code* stub,
2266a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org                                  ICacheFlushMode icache_flush_mode) {
227e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(*pc_ == kCallOpcode);
228e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE);
2296a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  Assembler::set_target_address_at(pc_ + 1, host_, stub->instruction_start(),
2306a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org                                   icache_flush_mode);
231e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org}
232e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
233e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
23443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenAddress RelocInfo::call_address() {
235e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((IsJSReturn(rmode()) && IsPatchedReturnSequence()) ||
236c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org         (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()));
23797b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org  return Assembler::target_address_at(pc_ + 1, host_);
23843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
23943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
24043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
24143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid RelocInfo::set_call_address(Address target) {
242e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((IsJSReturn(rmode()) && IsPatchedReturnSequence()) ||
243c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org         (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()));
24497b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org  Assembler::set_target_address_at(pc_ + 1, host_, target);
245c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (host() != NULL) {
246c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    Object* target_code = Code::GetCodeFromTargetAddress(target);
247c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(
248c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        host(), this, HeapObject::cast(target_code));
249c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
25043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
25143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
25243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
25343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenObject* RelocInfo::call_object() {
25443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return *call_object_address();
25543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
25643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
25743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
258c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.orgvoid RelocInfo::set_call_object(Object* target) {
259c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org  *call_object_address() = target;
26043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
26143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
26243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
263c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.orgObject** RelocInfo::call_object_address() {
264e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((IsJSReturn(rmode()) && IsPatchedReturnSequence()) ||
265c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org         (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()));
266c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org  return reinterpret_cast<Object**>(pc_ + 1);
26743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
26843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
26943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
270057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgvoid RelocInfo::WipeOut() {
271057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  if (IsEmbeddedObject(rmode_) || IsExternalReference(rmode_)) {
272057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org    Memory::Address_at(pc_) = NULL;
273057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  } else if (IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)) {
274057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org    // Effectively write zero into the relocation.
27597b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org    Assembler::set_target_address_at(pc_, host_, pc_ + sizeof(int32_t));
276057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  } else {
277057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org    UNREACHABLE();
278057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  }
279057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org}
280057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org
281057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org
2829d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.combool RelocInfo::IsPatchedReturnSequence() {
283e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  return *pc_ == kCallOpcode;
28443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
28543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
28643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2872356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.orgbool RelocInfo::IsPatchedDebugBreakSlotSequence() {
2882356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  return !Assembler::IsNop(pc());
2892356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org}
2902356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
2912356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
292e97852de34e44a479f092bd2449134e707cd9cf1dslomov@chromium.orgvoid RelocInfo::Visit(Isolate* isolate, ObjectVisitor* visitor) {
2939155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  RelocInfo::Mode mode = rmode();
2949155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  if (mode == RelocInfo::EMBEDDED_OBJECT) {
295b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org    visitor->VisitEmbeddedPointer(this);
2965de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org    CpuFeatures::FlushICache(pc_, sizeof(Address));
2979155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  } else if (RelocInfo::IsCodeTarget(mode)) {
2989155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org    visitor->VisitCodeTarget(this);
29941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  } else if (mode == RelocInfo::CELL) {
30041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org    visitor->VisitCell(this);
3019155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  } else if (mode == RelocInfo::EXTERNAL_REFERENCE) {
30204e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org    visitor->VisitExternalReference(this);
3035de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org    CpuFeatures::FlushICache(pc_, sizeof(Address));
304e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  } else if (RelocInfo::IsCodeAgeSequence(mode)) {
305e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    visitor->VisitCodeAgeSequence(this);
306ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  } else if (((RelocInfo::IsJSReturn(mode) &&
3072356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org              IsPatchedReturnSequence()) ||
3082356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org             (RelocInfo::IsDebugBreakSlot(mode) &&
309ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org              IsPatchedDebugBreakSlotSequence())) &&
310e97852de34e44a479f092bd2449134e707cd9cf1dslomov@chromium.org             isolate->debug()->has_break_points()) {
3119155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org    visitor->VisitDebugTarget(this);
3126e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  } else if (IsRuntimeEntry(mode)) {
3139155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org    visitor->VisitRuntimeEntry(this);
3149155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  }
3159155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org}
3169155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
3179155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
318ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgtemplate<typename StaticVisitor>
319ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid RelocInfo::Visit(Heap* heap) {
320ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  RelocInfo::Mode mode = rmode();
321ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  if (mode == RelocInfo::EMBEDDED_OBJECT) {
322b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org    StaticVisitor::VisitEmbeddedPointer(heap, this);
3235de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org    CpuFeatures::FlushICache(pc_, sizeof(Address));
324ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  } else if (RelocInfo::IsCodeTarget(mode)) {
325c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org    StaticVisitor::VisitCodeTarget(heap, this);
32641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  } else if (mode == RelocInfo::CELL) {
32741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org    StaticVisitor::VisitCell(heap, this);
328ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  } else if (mode == RelocInfo::EXTERNAL_REFERENCE) {
32904e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org    StaticVisitor::VisitExternalReference(this);
3305de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org    CpuFeatures::FlushICache(pc_, sizeof(Address));
331e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  } else if (RelocInfo::IsCodeAgeSequence(mode)) {
332e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    StaticVisitor::VisitCodeAgeSequence(heap, this);
333ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  } else if (heap->isolate()->debug()->has_break_points() &&
334ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org             ((RelocInfo::IsJSReturn(mode) &&
335ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org              IsPatchedReturnSequence()) ||
336ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org             (RelocInfo::IsDebugBreakSlot(mode) &&
337ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org              IsPatchedDebugBreakSlotSequence()))) {
338c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org    StaticVisitor::VisitDebugTarget(heap, this);
3396e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  } else if (IsRuntimeEntry(mode)) {
340ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org    StaticVisitor::VisitRuntimeEntry(this);
341ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  }
342ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}
343ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
344ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
345ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
34643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenImmediate::Immediate(int x)  {
34743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  x_ = x;
34859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  rmode_ = RelocInfo::NONE32;
34943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
35043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenImmediate::Immediate(const ExternalReference& ext) {
35343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  x_ = reinterpret_cast<int32_t>(ext.address());
354236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org  rmode_ = RelocInfo::EXTERNAL_REFERENCE;
35543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
35643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
358b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.orgImmediate::Immediate(Label* internal_offset) {
35937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  x_ = reinterpret_cast<int32_t>(internal_offset);
36037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  rmode_ = RelocInfo::INTERNAL_REFERENCE;
36137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
36237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
36337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
36443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenImmediate::Immediate(Handle<Object> handle) {
36579e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  AllowDeferredHandleDereference using_raw_address;
36643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Verify all Objects referred by code are NOT in new space.
36743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Object* obj = *handle;
36843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (obj->IsHeapObject()) {
369e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(!HeapObject::cast(obj)->GetHeap()->InNewSpace(obj));
37043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    x_ = reinterpret_cast<intptr_t>(handle.location());
371236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org    rmode_ = RelocInfo::EMBEDDED_OBJECT;
37243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
37343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // no relocation needed
37443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    x_ =  reinterpret_cast<intptr_t>(obj);
37559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org    rmode_ = RelocInfo::NONE32;
37643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
37743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
37843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
37943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
38043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenImmediate::Immediate(Smi* value) {
38143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  x_ = reinterpret_cast<intptr_t>(value);
38259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  rmode_ = RelocInfo::NONE32;
38343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
38443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
38543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
386a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgImmediate::Immediate(Address addr) {
387a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  x_ = reinterpret_cast<int32_t>(addr);
38859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  rmode_ = RelocInfo::NONE32;
389a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
390a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
391a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
39243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::emit(uint32_t x) {
39343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  *reinterpret_cast<uint32_t*>(pc_) = x;
39443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  pc_ += sizeof(uint32_t);
39543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
39643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
39743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
39843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::emit(Handle<Object> handle) {
39979e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  AllowDeferredHandleDereference heap_object_check;
40043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Verify all Objects referred by code are NOT in new space.
40143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Object* obj = *handle;
402e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!isolate()->heap()->InNewSpace(obj));
40343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (obj->IsHeapObject()) {
404236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org    emit(reinterpret_cast<intptr_t>(handle.location()),
405236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org         RelocInfo::EMBEDDED_OBJECT);
40643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
40743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // no relocation needed
40843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    emit(reinterpret_cast<intptr_t>(obj));
40943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
41043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
41143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
41243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
413471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.orgvoid Assembler::emit(uint32_t x, RelocInfo::Mode rmode, TypeFeedbackId id) {
414471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  if (rmode == RelocInfo::CODE_TARGET && !id.IsNone()) {
415471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    RecordRelocInfo(RelocInfo::CODE_TARGET_WITH_ID, id.ToInt());
416c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  } else if (!RelocInfo::IsNone(rmode)
417c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org      && rmode != RelocInfo::CODE_AGE_SEQUENCE) {
4188e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    RecordRelocInfo(rmode);
4198e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  }
42043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit(x);
42143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
42243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgvoid Assembler::emit(Handle<Code> code,
42532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org                     RelocInfo::Mode rmode,
42632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org                     TypeFeedbackId id) {
42779e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  AllowDeferredHandleDereference embedding_raw_address;
42832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  emit(reinterpret_cast<intptr_t>(code.location()), rmode, id);
42932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org}
43032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
43132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
43243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::emit(const Immediate& x) {
43337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (x.rmode_ == RelocInfo::INTERNAL_REFERENCE) {
43437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    Label* label = reinterpret_cast<Label*>(x.x_);
43537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    emit_code_relative_offset(label);
43637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    return;
43737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
4384cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  if (!RelocInfo::IsNone(x.rmode_)) RecordRelocInfo(x.rmode_);
43943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit(x.x_);
44043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
44143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
44243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
44337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comvoid Assembler::emit_code_relative_offset(Label* label) {
44437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (label->is_bound()) {
44537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    int32_t pos;
44637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    pos = label->pos() + Code::kHeaderSize - kHeapObjectTag;
44737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    emit(pos);
44837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  } else {
44937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    emit_disp(label, Displacement::CODE_RELATIVE);
45037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
45137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
45237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
45337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
454a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid Assembler::emit_w(const Immediate& x) {
455e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(RelocInfo::IsNone(x.rmode_));
456a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  uint16_t value = static_cast<uint16_t>(x.x_);
457a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  reinterpret_cast<uint16_t*>(pc_)[0] = value;
458a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  pc_ += sizeof(uint16_t);
459a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
460a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
461a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
46297b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.orgAddress Assembler::target_address_at(Address pc,
46397b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org                                     ConstantPoolArray* constant_pool) {
46443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return pc + sizeof(int32_t) + *reinterpret_cast<int32_t*>(pc);
46543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
46643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4677276f14ca716596e0a0d17539516370c1f453847kasper.lund
46897b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.orgvoid Assembler::set_target_address_at(Address pc,
46997b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org                                      ConstantPoolArray* constant_pool,
4706a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org                                      Address target,
4716a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org                                      ICacheFlushMode icache_flush_mode) {
47243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int32_t* p = reinterpret_cast<int32_t*>(pc);
47343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  *p = target - (pc + sizeof(int32_t));
4746a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  if (icache_flush_mode != SKIP_ICACHE_FLUSH) {
4755de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org    CpuFeatures::FlushICache(p, sizeof(int32_t));
4766a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  }
47743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
47843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4797276f14ca716596e0a0d17539516370c1f453847kasper.lund
48089e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.orgAddress Assembler::target_address_from_return_address(Address pc) {
48189e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  return pc - kCallTargetAddressOffset;
48289e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org}
48389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
48489e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
4859d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgAddress Assembler::break_address_from_return_address(Address pc) {
4869d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org  return pc - Assembler::kPatchDebugBreakSlotReturnOffset;
4879d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org}
4889d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org
4899d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org
4907276f14ca716596e0a0d17539516370c1f453847kasper.lundDisplacement Assembler::disp_at(Label* L) {
4917276f14ca716596e0a0d17539516370c1f453847kasper.lund  return Displacement(long_at(L->pos()));
4927276f14ca716596e0a0d17539516370c1f453847kasper.lund}
4937276f14ca716596e0a0d17539516370c1f453847kasper.lund
4947276f14ca716596e0a0d17539516370c1f453847kasper.lund
4957276f14ca716596e0a0d17539516370c1f453847kasper.lundvoid Assembler::disp_at_put(Label* L, Displacement disp) {
4967276f14ca716596e0a0d17539516370c1f453847kasper.lund  long_at_put(L->pos(), disp.data());
4977276f14ca716596e0a0d17539516370c1f453847kasper.lund}
4987276f14ca716596e0a0d17539516370c1f453847kasper.lund
4997276f14ca716596e0a0d17539516370c1f453847kasper.lund
5007276f14ca716596e0a0d17539516370c1f453847kasper.lundvoid Assembler::emit_disp(Label* L, Displacement::Type type) {
5017276f14ca716596e0a0d17539516370c1f453847kasper.lund  Displacement disp(L, type);
5027276f14ca716596e0a0d17539516370c1f453847kasper.lund  L->link_to(pc_offset());
5037276f14ca716596e0a0d17539516370c1f453847kasper.lund  emit(static_cast<int>(disp.data()));
5047276f14ca716596e0a0d17539516370c1f453847kasper.lund}
5057276f14ca716596e0a0d17539516370c1f453847kasper.lund
5067276f14ca716596e0a0d17539516370c1f453847kasper.lund
50783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.orgvoid Assembler::emit_near_disp(Label* L) {
50883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  byte disp = 0x00;
50983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  if (L->is_near_linked()) {
51083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org    int offset = L->near_link_pos() - pc_offset();
511e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(is_int8(offset));
51283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org    disp = static_cast<byte>(offset & 0xFF);
51383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  }
51483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  L->link_to(pc_offset(), Label::kNear);
51583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  *pc_++ = disp;
51683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org}
51783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org
51883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org
519ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgvoid Operand::set_modrm(int mod, Register rm) {
520e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((mod & -4) == 0);
52143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  buf_[0] = mod << 6 | rm.code();
52243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  len_ = 1;
52343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
52443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
52543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
52671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgvoid Operand::set_sib(ScaleFactor scale, Register index, Register base) {
527e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(len_ == 1);
528e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((scale & -4) == 0);
52971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  // Use SIB with no index register only for base esp.
530e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!index.is(esp) || base.is(esp));
53171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  buf_[1] = scale << 6 | index.code() << 3 | base.code();
53271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  len_ = 2;
53371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org}
53471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
53571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
53671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgvoid Operand::set_disp8(int8_t disp) {
537e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(len_ == 1 || len_ == 2);
53871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  *reinterpret_cast<int8_t*>(&buf_[len_++]) = disp;
53971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org}
54071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
54171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
542236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgvoid Operand::set_dispr(int32_t disp, RelocInfo::Mode rmode) {
543e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(len_ == 1 || len_ == 2);
5447be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  int32_t* p = reinterpret_cast<int32_t*>(&buf_[len_]);
5457be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  *p = disp;
54643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  len_ += sizeof(int32_t);
54743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  rmode_ = rmode;
54843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
54943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
55043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenOperand::Operand(Register reg) {
55143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // reg
55243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  set_modrm(3, reg);
55343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
55443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
55543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
556086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgOperand::Operand(XMMRegister xmm_reg) {
557086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  Register reg = { xmm_reg.code() };
558086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  set_modrm(3, reg);
559086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org}
560086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
561086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
562236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgOperand::Operand(int32_t disp, RelocInfo::Mode rmode) {
56343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // [disp/r]
56443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  set_modrm(0, ebp);
56543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  set_dispr(disp, rmode);
56643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
56743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgOperand::Operand(Immediate imm) {
5707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // [disp/r]
5717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  set_modrm(0, ebp);
5727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  set_dispr(imm.x_, imm.rmode_);
5737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
57443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
57543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5765ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#endif  // V8_IA32_ASSEMBLER_IA32_INL_H_
577