13b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Copyright (c) 1994-2006 Sun Microsystems Inc. 23b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// All Rights Reserved. 33b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// 43b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Redistribution and use in source and binary forms, with or without 53b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// modification, are permitted provided that the following conditions 63b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// are met: 73b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// 83b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// - Redistributions of source code must retain the above copyright notice, 93b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// this list of conditions and the following disclaimer. 103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// 113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// - Redistribution in binary form must reproduce the above copyright 123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// notice, this list of conditions and the following disclaimer in the 133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// documentation and/or other materials provided with the 143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// distribution. 153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// 163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// - Neither the name of Sun Microsystems or the names of contributors may 173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// be used to endorse or promote products derived from this software without 183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// specific prior written permission. 193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// 203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// OF THE POSSIBILITY OF SUCH DAMAGE. 323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// The original source code covered by the above license above has been modified 343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// significantly by Google Inc. 353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Copyright 2014 the V8 project authors. All rights reserved. 363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#ifndef V8_S390_ASSEMBLER_S390_INL_H_ 383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#define V8_S390_ASSEMBLER_S390_INL_H_ 393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/s390/assembler-s390.h" 413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/assembler.h" 433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/debug/debug.h" 4462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects-inl.h" 453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochnamespace v8 { 473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochnamespace internal { 483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochbool CpuFeatures::SupportsCrankshaft() { return true; } 503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 51f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochbool CpuFeatures::SupportsSimd128() { return false; } 52f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid RelocInfo::apply(intptr_t delta) { 543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Absolute code pointer inside code object moves with the code object. 553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (IsInternalReference(rmode_)) { 563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Jump table entry 573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Address target = Memory::Address_at(pc_); 583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Memory::Address_at(pc_) = target + delta; 593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else if (IsCodeTarget(rmode_)) { 603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch SixByteInstr instr = 613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Instruction::InstructionBits(reinterpret_cast<const byte*>(pc_)); 623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int32_t dis = static_cast<int32_t>(instr & 0xFFFFFFFF) * 2 // halfwords 633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch - static_cast<int32_t>(delta); 643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr >>= 32; // Clear the 4-byte displacement field. 653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr <<= 32; 663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr |= static_cast<uint32_t>(dis / 2); 673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Instruction::SetInstructionBits<SixByteInstr>(reinterpret_cast<byte*>(pc_), 683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr); 693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else { 703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // mov sequence 713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(IsInternalReferenceEncoded(rmode_)); 723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Address target = Assembler::target_address_at(pc_, host_); 733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Assembler::set_target_address_at(isolate_, pc_, host_, target + delta, 743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch SKIP_ICACHE_FLUSH); 753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochAddress RelocInfo::target_internal_reference() { 793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (IsInternalReference(rmode_)) { 803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Jump table entry 813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return Memory::Address_at(pc_); 823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else { 833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // mov sequence 843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(IsInternalReferenceEncoded(rmode_)); 853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return Assembler::target_address_at(pc_, host_); 863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochAddress RelocInfo::target_internal_reference_address() { 903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_)); 913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return reinterpret_cast<Address>(pc_); 923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochAddress RelocInfo::target_address() { 953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)); 963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return Assembler::target_address_at(pc_, host_); 973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochAddress RelocInfo::target_address_address() { 1003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_) || 1013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch rmode_ == EMBEDDED_OBJECT || rmode_ == EXTERNAL_REFERENCE); 1023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Read the address of the word containing the target_address in an 1043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // instruction stream. 1053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // The only architecture-independent user of this function is the serializer. 1063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // The serializer uses it to find out how many raw bytes of instruction to 1073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // output before the next target. 1083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // For an instruction like LIS/ORI where the target bits are mixed into the 1093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // instruction bits, the size of the target will be zero, indicating that the 1103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // serializer should not step forward in memory after a target is resolved 1113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // and written. 1123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return reinterpret_cast<Address>(pc_); 1133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 1143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochAddress RelocInfo::constant_pool_entry_address() { 1163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch UNREACHABLE(); 1173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return NULL; 1183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 1193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochint RelocInfo::target_address_size() { return Assembler::kSpecialTargetSize; } 1213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 12262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochAddress Assembler::target_address_at(Address pc, Code* code) { 12362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Address constant_pool = code ? code->constant_pool() : NULL; 12462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return target_address_at(pc, constant_pool); 12562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 12662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 12762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid Assembler::set_target_address_at(Isolate* isolate, Address pc, Code* code, 12862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Address target, 12962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ICacheFlushMode icache_flush_mode) { 13062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Address constant_pool = code ? code->constant_pool() : NULL; 13162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch set_target_address_at(isolate, pc, constant_pool, target, icache_flush_mode); 13262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 13362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochAddress Assembler::target_address_from_return_address(Address pc) { 1353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Returns the address of the call target from the return address that will 1363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // be returned to after a call. 1373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Sequence is: 1383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // BRASL r14, RI 1393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return pc - kCallTargetAddressOffset; 1403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 1413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochAddress Assembler::return_address_from_call_start(Address pc) { 1433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Sequence is: 1443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // BRASL r14, RI 1453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return pc + kCallTargetAddressOffset; 1463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 1473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochHandle<Object> Assembler::code_target_object_handle_at(Address pc) { 1493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch SixByteInstr instr = 1503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Instruction::InstructionBits(reinterpret_cast<const byte*>(pc)); 1513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int index = instr & 0xFFFFFFFF; 1523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return code_targets_[index]; 1533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 1543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochObject* RelocInfo::target_object() { 1563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); 1573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return reinterpret_cast<Object*>(Assembler::target_address_at(pc_, host_)); 1583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 1593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochHandle<Object> RelocInfo::target_object_handle(Assembler* origin) { 1613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); 1623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (rmode_ == EMBEDDED_OBJECT) { 1633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return Handle<Object>( 1643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch reinterpret_cast<Object**>(Assembler::target_address_at(pc_, host_))); 1653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else { 1663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return origin->code_target_object_handle_at(pc_); 1673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 1683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 1693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid RelocInfo::set_target_object(Object* target, 1713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch WriteBarrierMode write_barrier_mode, 1723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch ICacheFlushMode icache_flush_mode) { 1733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); 1743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Assembler::set_target_address_at(isolate_, pc_, host_, 1753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch reinterpret_cast<Address>(target), 1763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch icache_flush_mode); 1773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL && 1783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch target->IsHeapObject()) { 1793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( 1803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch host(), this, HeapObject::cast(target)); 181f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch host()->GetHeap()->RecordWriteIntoCode(host(), this, target); 1823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 1833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 1843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochAddress RelocInfo::target_external_reference() { 1863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(rmode_ == EXTERNAL_REFERENCE); 1873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return Assembler::target_address_at(pc_, host_); 1883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 1893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochAddress RelocInfo::target_runtime_entry(Assembler* origin) { 1913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(IsRuntimeEntry(rmode_)); 1923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return target_address(); 1933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 1943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid RelocInfo::set_target_runtime_entry(Address target, 1963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch WriteBarrierMode write_barrier_mode, 1973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch ICacheFlushMode icache_flush_mode) { 1983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(IsRuntimeEntry(rmode_)); 1993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (target_address() != target) 2003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch set_target_address(target, write_barrier_mode, icache_flush_mode); 2013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 2023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochHandle<Cell> RelocInfo::target_cell_handle() { 2043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(rmode_ == RelocInfo::CELL); 2053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Address address = Memory::Address_at(pc_); 2063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return Handle<Cell>(reinterpret_cast<Cell**>(address)); 2073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 2083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochCell* RelocInfo::target_cell() { 2103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(rmode_ == RelocInfo::CELL); 2113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return Cell::FromValueAddress(Memory::Address_at(pc_)); 2123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 2133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid RelocInfo::set_target_cell(Cell* cell, WriteBarrierMode write_barrier_mode, 2153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch ICacheFlushMode icache_flush_mode) { 2163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(rmode_ == RelocInfo::CELL); 2173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Address address = cell->address() + Cell::kValueOffset; 2183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Memory::Address_at(pc_) = address; 2193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL) { 2203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this, 2213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch cell); 2223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 2233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 2243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#if V8_TARGET_ARCH_S390X 2263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// NOP(2byte) + PUSH + MOV + BASR = 2273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// NOP + LAY + STG + IIHF + IILF + BASR 2283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochstatic const int kCodeAgingSequenceLength = 28; 2293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochstatic const int kCodeAgingTargetDelta = 14; // Jump past NOP + PUSH to IIHF 2303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // LAY + 4 * STG + LA 2313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochstatic const int kNoCodeAgeSequenceLength = 34; 2323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#else 2333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#if (V8_HOST_ARCH_S390) 2343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// NOP + NILH + LAY + ST + IILF + BASR 2353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochstatic const int kCodeAgingSequenceLength = 24; 2363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochstatic const int kCodeAgingTargetDelta = 16; // Jump past NOP to IILF 2373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// NILH + LAY + 4 * ST + LA 2383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochstatic const int kNoCodeAgeSequenceLength = 30; 2393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#else 2403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// NOP + LAY + ST + IILF + BASR 2413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochstatic const int kCodeAgingSequenceLength = 20; 2423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochstatic const int kCodeAgingTargetDelta = 12; // Jump past NOP to IILF 2433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// LAY + 4 * ST + LA 2443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochstatic const int kNoCodeAgeSequenceLength = 26; 2453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#endif 2463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#endif 2473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochHandle<Object> RelocInfo::code_age_stub_handle(Assembler* origin) { 2493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch UNREACHABLE(); // This should never be reached on S390. 2503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return Handle<Object>(); 2513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 2523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochCode* RelocInfo::code_age_stub() { 2543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); 2553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return Code::GetCodeFromTargetAddress( 2563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Assembler::target_address_at(pc_ + kCodeAgingTargetDelta, host_)); 2573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 2583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid RelocInfo::set_code_age_stub(Code* stub, 2603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch ICacheFlushMode icache_flush_mode) { 2613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); 2623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Assembler::set_target_address_at(isolate_, pc_ + kCodeAgingTargetDelta, host_, 2633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch stub->instruction_start(), 2643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch icache_flush_mode); 2653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 2663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochAddress RelocInfo::debug_call_address() { 2683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()); 2693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return Assembler::target_address_at(pc_, host_); 2703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 2713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid RelocInfo::set_debug_call_address(Address target) { 2733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()); 2743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Assembler::set_target_address_at(isolate_, pc_, host_, target); 2753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (host() != NULL) { 2763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Object* target_code = Code::GetCodeFromTargetAddress(target); 2773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( 2783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch host(), this, HeapObject::cast(target_code)); 2793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 2803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 2813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid RelocInfo::WipeOut() { 2833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || 2843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || 2853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_)); 2863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (IsInternalReference(rmode_)) { 2873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Jump table entry 2883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Memory::Address_at(pc_) = NULL; 2893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else if (IsInternalReferenceEncoded(rmode_)) { 2903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // mov sequence 2913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Currently used only by deserializer, no need to flush. 2923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Assembler::set_target_address_at(isolate_, pc_, host_, NULL, 2933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch SKIP_ICACHE_FLUSH); 2943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else { 2953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Assembler::set_target_address_at(isolate_, pc_, host_, NULL); 2963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 2973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 2983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 299bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochtemplate <typename ObjectVisitor> 3003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid RelocInfo::Visit(Isolate* isolate, ObjectVisitor* visitor) { 3013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch RelocInfo::Mode mode = rmode(); 3023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (mode == RelocInfo::EMBEDDED_OBJECT) { 3033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch visitor->VisitEmbeddedPointer(this); 3043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else if (RelocInfo::IsCodeTarget(mode)) { 3053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch visitor->VisitCodeTarget(this); 3063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else if (mode == RelocInfo::CELL) { 3073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch visitor->VisitCell(this); 3083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { 3093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch visitor->VisitExternalReference(this); 3103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else if (mode == RelocInfo::INTERNAL_REFERENCE) { 3113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch visitor->VisitInternalReference(this); 3123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else if (RelocInfo::IsCodeAgeSequence(mode)) { 3133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch visitor->VisitCodeAgeSequence(this); 3143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else if (RelocInfo::IsDebugBreakSlot(mode) && 3153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch IsPatchedDebugBreakSlotSequence()) { 3163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch visitor->VisitDebugTarget(this); 3173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else if (IsRuntimeEntry(mode)) { 3183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch visitor->VisitRuntimeEntry(this); 3193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 3203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 3213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 3223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochtemplate <typename StaticVisitor> 3233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid RelocInfo::Visit(Heap* heap) { 3243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch RelocInfo::Mode mode = rmode(); 3253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (mode == RelocInfo::EMBEDDED_OBJECT) { 3263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch StaticVisitor::VisitEmbeddedPointer(heap, this); 3273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else if (RelocInfo::IsCodeTarget(mode)) { 3283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch StaticVisitor::VisitCodeTarget(heap, this); 3293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else if (mode == RelocInfo::CELL) { 3303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch StaticVisitor::VisitCell(heap, this); 3313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { 3323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch StaticVisitor::VisitExternalReference(this); 3333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else if (mode == RelocInfo::INTERNAL_REFERENCE) { 3343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch StaticVisitor::VisitInternalReference(this); 3353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else if (RelocInfo::IsCodeAgeSequence(mode)) { 3363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch StaticVisitor::VisitCodeAgeSequence(heap, this); 3373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else if (RelocInfo::IsDebugBreakSlot(mode) && 3383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch IsPatchedDebugBreakSlotSequence()) { 3393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch StaticVisitor::VisitDebugTarget(heap, this); 3403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else if (IsRuntimeEntry(mode)) { 3413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch StaticVisitor::VisitRuntimeEntry(this); 3423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 3433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 3443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 3453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Operand constructors 3463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochOperand::Operand(intptr_t immediate, RelocInfo::Mode rmode) { 3473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch rm_ = no_reg; 3483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch imm_ = immediate; 3493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch rmode_ = rmode; 3503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 3513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 3523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochOperand::Operand(const ExternalReference& f) { 3533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch rm_ = no_reg; 3543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch imm_ = reinterpret_cast<intptr_t>(f.address()); 3553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch rmode_ = RelocInfo::EXTERNAL_REFERENCE; 3563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 3573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 3583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochOperand::Operand(Smi* value) { 3593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch rm_ = no_reg; 3603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch imm_ = reinterpret_cast<intptr_t>(value); 3613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch rmode_ = kRelocInfo_NONEPTR; 3623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 3633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 3643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochOperand::Operand(Register rm) { 3653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch rm_ = rm; 3663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch rmode_ = kRelocInfo_NONEPTR; // S390 -why doesn't ARM do this? 3673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 3683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 3693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::CheckBuffer() { 3703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (buffer_space() <= kGap) { 3713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch GrowBuffer(); 3723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 3733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 3743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 3753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochint32_t Assembler::emit_code_target(Handle<Code> target, RelocInfo::Mode rmode, 3763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch TypeFeedbackId ast_id) { 3773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(RelocInfo::IsCodeTarget(rmode)); 3783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (rmode == RelocInfo::CODE_TARGET && !ast_id.IsNone()) { 3793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch SetRecordedAstId(ast_id); 3803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch RecordRelocInfo(RelocInfo::CODE_TARGET_WITH_ID); 3813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else { 3823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch RecordRelocInfo(rmode); 3833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 3843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 3853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int current = code_targets_.length(); 3863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (current > 0 && code_targets_.last().is_identical_to(target)) { 3873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Optimization if we keep jumping to the same code target. 3883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch current--; 3893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else { 3903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch code_targets_.Add(target); 3913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 3923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return current; 3933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 3943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 3953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Helper to emit the binary encoding of a 2 byte instruction 3963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::emit2bytes(uint16_t x) { 3973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch CheckBuffer(); 3983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#if V8_TARGET_LITTLE_ENDIAN 3993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // We need to emit instructions in big endian format as disassembler / 4003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // simulator require the first byte of the instruction in order to decode 4013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // the instruction length. Swap the bytes. 4023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch x = ((x & 0x00FF) << 8) | ((x & 0xFF00) >> 8); 4033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#endif 4043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch *reinterpret_cast<uint16_t*>(pc_) = x; 4053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch pc_ += 2; 4063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 4073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 4083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Helper to emit the binary encoding of a 4 byte instruction 4093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::emit4bytes(uint32_t x) { 4103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch CheckBuffer(); 4113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#if V8_TARGET_LITTLE_ENDIAN 4123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // We need to emit instructions in big endian format as disassembler / 4133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // simulator require the first byte of the instruction in order to decode 4143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // the instruction length. Swap the bytes. 4153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch x = ((x & 0x000000FF) << 24) | ((x & 0x0000FF00) << 8) | 4163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch ((x & 0x00FF0000) >> 8) | ((x & 0xFF000000) >> 24); 4173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#endif 4183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch *reinterpret_cast<uint32_t*>(pc_) = x; 4193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch pc_ += 4; 4203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 4213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 4223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Helper to emit the binary encoding of a 6 byte instruction 4233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::emit6bytes(uint64_t x) { 4243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch CheckBuffer(); 4253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#if V8_TARGET_LITTLE_ENDIAN 4263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // We need to emit instructions in big endian format as disassembler / 4273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // simulator require the first byte of the instruction in order to decode 4283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // the instruction length. Swap the bytes. 4293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch x = (static_cast<uint64_t>(x & 0xFF) << 40) | 4303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch (static_cast<uint64_t>((x >> 8) & 0xFF) << 32) | 4313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch (static_cast<uint64_t>((x >> 16) & 0xFF) << 24) | 4323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch (static_cast<uint64_t>((x >> 24) & 0xFF) << 16) | 4333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch (static_cast<uint64_t>((x >> 32) & 0xFF) << 8) | 4343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch (static_cast<uint64_t>((x >> 40) & 0xFF)); 4353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch x |= (*reinterpret_cast<uint64_t*>(pc_) >> 48) << 48; 4363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#else 4373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // We need to pad two bytes of zeros in order to get the 6-bytes 4383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // stored from low address. 4393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch x = x << 16; 4403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch x |= *reinterpret_cast<uint64_t*>(pc_) & 0xFFFF; 4413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#endif 4423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // It is safe to store 8-bytes, as CheckBuffer() guarantees we have kGap 4433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // space left over. 4443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch *reinterpret_cast<uint64_t*>(pc_) = x; 4453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch pc_ += 6; 4463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 4473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 4483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochbool Operand::is_reg() const { return rm_.is_valid(); } 4493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 4503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Fetch the 32bit value from the FIXED_SEQUENCE IIHF / IILF 4513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochAddress Assembler::target_address_at(Address pc, Address constant_pool) { 4523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // S390 Instruction! 4533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // We want to check for instructions generated by Asm::mov() 4543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Opcode op1 = Instruction::S390OpcodeValue(reinterpret_cast<const byte*>(pc)); 4553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch SixByteInstr instr_1 = 4563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Instruction::InstructionBits(reinterpret_cast<const byte*>(pc)); 4573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 4583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (BRASL == op1 || BRCL == op1) { 4593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int32_t dis = static_cast<int32_t>(instr_1 & 0xFFFFFFFF) * 2; 4603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return reinterpret_cast<Address>(reinterpret_cast<uint64_t>(pc) + dis); 4613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 4623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 4633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#if V8_TARGET_ARCH_S390X 4643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int instr1_length = 4653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Instruction::InstructionLength(reinterpret_cast<const byte*>(pc)); 4663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Opcode op2 = Instruction::S390OpcodeValue( 4673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch reinterpret_cast<const byte*>(pc + instr1_length)); 4683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch SixByteInstr instr_2 = Instruction::InstructionBits( 4693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch reinterpret_cast<const byte*>(pc + instr1_length)); 4703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // IIHF for hi_32, IILF for lo_32 4713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (IIHF == op1 && IILF == op2) { 4723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return reinterpret_cast<Address>(((instr_1 & 0xFFFFFFFF) << 32) | 4733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch ((instr_2 & 0xFFFFFFFF))); 4743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 4753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#else 4763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // IILF loads 32-bits 4773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (IILF == op1 || CFI == op1) { 4783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return reinterpret_cast<Address>((instr_1 & 0xFFFFFFFF)); 4793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 4803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#endif 4813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 4823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch UNIMPLEMENTED(); 4833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return (Address)0; 4843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 4853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 4863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// This sets the branch destination (which gets loaded at the call address). 4873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// This is for calls and branches within generated code. The serializer 4883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// has already deserialized the mov instructions etc. 4893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// There is a FIXED_SEQUENCE assumption here 4903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::deserialization_set_special_target_at( 4913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Isolate* isolate, Address instruction_payload, Code* code, Address target) { 4923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch set_target_address_at(isolate, instruction_payload, code, target); 4933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 4943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 4953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::deserialization_set_target_internal_reference_at( 4963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Isolate* isolate, Address pc, Address target, RelocInfo::Mode mode) { 4973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (RelocInfo::IsInternalReferenceEncoded(mode)) { 4983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Code* code = NULL; 4993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch set_target_address_at(isolate, pc, code, target, SKIP_ICACHE_FLUSH); 5003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else { 5013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Memory::Address_at(pc) = target; 5023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 5033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 5043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 5053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// This code assumes the FIXED_SEQUENCE of IIHF/IILF 5063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::set_target_address_at(Isolate* isolate, Address pc, 5073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Address constant_pool, Address target, 5083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch ICacheFlushMode icache_flush_mode) { 5093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Check for instructions generated by Asm::mov() 5103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Opcode op1 = Instruction::S390OpcodeValue(reinterpret_cast<const byte*>(pc)); 5113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch SixByteInstr instr_1 = 5123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Instruction::InstructionBits(reinterpret_cast<const byte*>(pc)); 5133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool patched = false; 5143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 5153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (BRASL == op1 || BRCL == op1) { 5163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr_1 >>= 32; // Zero out the lower 32-bits 5173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr_1 <<= 32; 5183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int32_t halfwords = (target - pc) / 2; // number of halfwords 5193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr_1 |= static_cast<uint32_t>(halfwords); 5203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Instruction::SetInstructionBits<SixByteInstr>(reinterpret_cast<byte*>(pc), 5213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr_1); 5223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (icache_flush_mode != SKIP_ICACHE_FLUSH) { 5233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Assembler::FlushICache(isolate, pc, 6); 5243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 5253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch patched = true; 5263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else { 5273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#if V8_TARGET_ARCH_S390X 5283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int instr1_length = 5293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Instruction::InstructionLength(reinterpret_cast<const byte*>(pc)); 5303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Opcode op2 = Instruction::S390OpcodeValue( 5313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch reinterpret_cast<const byte*>(pc + instr1_length)); 5323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch SixByteInstr instr_2 = Instruction::InstructionBits( 5333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch reinterpret_cast<const byte*>(pc + instr1_length)); 5343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // IIHF for hi_32, IILF for lo_32 5353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (IIHF == op1 && IILF == op2) { 5363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // IIHF 5373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr_1 >>= 32; // Zero out the lower 32-bits 5383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr_1 <<= 32; 5393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr_1 |= reinterpret_cast<uint64_t>(target) >> 32; 5403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 5413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Instruction::SetInstructionBits<SixByteInstr>(reinterpret_cast<byte*>(pc), 5423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr_1); 5433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 5443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // IILF 5453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr_2 >>= 32; 5463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr_2 <<= 32; 5473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr_2 |= reinterpret_cast<uint64_t>(target) & 0xFFFFFFFF; 5483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 5493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Instruction::SetInstructionBits<SixByteInstr>( 5503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch reinterpret_cast<byte*>(pc + instr1_length), instr_2); 5513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (icache_flush_mode != SKIP_ICACHE_FLUSH) { 5523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Assembler::FlushICache(isolate, pc, 12); 5533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 5543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch patched = true; 5553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 5563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#else 5573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // IILF loads 32-bits 5583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (IILF == op1 || CFI == op1) { 5593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr_1 >>= 32; // Zero out the lower 32-bits 5603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr_1 <<= 32; 5613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr_1 |= reinterpret_cast<uint32_t>(target); 5623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 5633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Instruction::SetInstructionBits<SixByteInstr>(reinterpret_cast<byte*>(pc), 5643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr_1); 5653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (icache_flush_mode != SKIP_ICACHE_FLUSH) { 5663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Assembler::FlushICache(isolate, pc, 6); 5673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 5683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch patched = true; 5693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 5703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#endif 5713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 5723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (!patched) UNREACHABLE(); 5733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 5743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 5753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} // namespace internal 5763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} // namespace v8 5773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 5783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#endif // V8_S390_ASSEMBLER_S390_INL_H_ 579