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