11cb0ef41Sopenharmony_ci// Copyright (c) 1994-2006 Sun Microsystems Inc. 21cb0ef41Sopenharmony_ci// All Rights Reserved. 31cb0ef41Sopenharmony_ci// 41cb0ef41Sopenharmony_ci// Redistribution and use in source and binary forms, with or without 51cb0ef41Sopenharmony_ci// modification, are permitted provided that the following conditions are 61cb0ef41Sopenharmony_ci// met: 71cb0ef41Sopenharmony_ci// 81cb0ef41Sopenharmony_ci// - Redistributions of source code must retain the above copyright notice, 91cb0ef41Sopenharmony_ci// this list of conditions and the following disclaimer. 101cb0ef41Sopenharmony_ci// 111cb0ef41Sopenharmony_ci// - Redistribution in binary form must reproduce the above copyright 121cb0ef41Sopenharmony_ci// notice, this list of conditions and the following disclaimer in the 131cb0ef41Sopenharmony_ci// documentation and/or other materials provided with the distribution. 141cb0ef41Sopenharmony_ci// 151cb0ef41Sopenharmony_ci// - Neither the name of Sun Microsystems or the names of contributors may 161cb0ef41Sopenharmony_ci// be used to endorse or promote products derived from this software without 171cb0ef41Sopenharmony_ci// specific prior written permission. 181cb0ef41Sopenharmony_ci// 191cb0ef41Sopenharmony_ci// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 201cb0ef41Sopenharmony_ci// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 211cb0ef41Sopenharmony_ci// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 221cb0ef41Sopenharmony_ci// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 231cb0ef41Sopenharmony_ci// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 241cb0ef41Sopenharmony_ci// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 251cb0ef41Sopenharmony_ci// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 261cb0ef41Sopenharmony_ci// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 271cb0ef41Sopenharmony_ci// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 281cb0ef41Sopenharmony_ci// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 291cb0ef41Sopenharmony_ci// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 301cb0ef41Sopenharmony_ci 311cb0ef41Sopenharmony_ci// The original source code covered by the above license above has been 321cb0ef41Sopenharmony_ci// modified significantly by Google Inc. 331cb0ef41Sopenharmony_ci// Copyright 2012 the V8 project authors. All rights reserved. 341cb0ef41Sopenharmony_ci 351cb0ef41Sopenharmony_ci// A light-weight IA32 Assembler. 361cb0ef41Sopenharmony_ci 371cb0ef41Sopenharmony_ci#ifndef V8_CODEGEN_IA32_ASSEMBLER_IA32_INL_H_ 381cb0ef41Sopenharmony_ci#define V8_CODEGEN_IA32_ASSEMBLER_IA32_INL_H_ 391cb0ef41Sopenharmony_ci 401cb0ef41Sopenharmony_ci#include "src/codegen/ia32/assembler-ia32.h" 411cb0ef41Sopenharmony_ci 421cb0ef41Sopenharmony_ci#include "src/base/memory.h" 431cb0ef41Sopenharmony_ci#include "src/codegen/assembler.h" 441cb0ef41Sopenharmony_ci#include "src/debug/debug.h" 451cb0ef41Sopenharmony_ci#include "src/objects/objects-inl.h" 461cb0ef41Sopenharmony_ci 471cb0ef41Sopenharmony_cinamespace v8 { 481cb0ef41Sopenharmony_cinamespace internal { 491cb0ef41Sopenharmony_ci 501cb0ef41Sopenharmony_cibool CpuFeatures::SupportsOptimizer() { return true; } 511cb0ef41Sopenharmony_ci 521cb0ef41Sopenharmony_ci// The modes possibly affected by apply must be in kApplyMask. 531cb0ef41Sopenharmony_civoid RelocInfo::apply(intptr_t delta) { 541cb0ef41Sopenharmony_ci DCHECK_EQ(kApplyMask, (RelocInfo::ModeMask(RelocInfo::CODE_TARGET) | 551cb0ef41Sopenharmony_ci RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) | 561cb0ef41Sopenharmony_ci RelocInfo::ModeMask(RelocInfo::OFF_HEAP_TARGET) | 571cb0ef41Sopenharmony_ci RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY))); 581cb0ef41Sopenharmony_ci if (IsRuntimeEntry(rmode_) || IsCodeTarget(rmode_) || 591cb0ef41Sopenharmony_ci IsOffHeapTarget(rmode_)) { 601cb0ef41Sopenharmony_ci base::WriteUnalignedValue(pc_, 611cb0ef41Sopenharmony_ci base::ReadUnalignedValue<int32_t>(pc_) - delta); 621cb0ef41Sopenharmony_ci } else if (IsInternalReference(rmode_)) { 631cb0ef41Sopenharmony_ci // Absolute code pointer inside code object moves with the code object. 641cb0ef41Sopenharmony_ci base::WriteUnalignedValue(pc_, 651cb0ef41Sopenharmony_ci base::ReadUnalignedValue<int32_t>(pc_) + delta); 661cb0ef41Sopenharmony_ci } 671cb0ef41Sopenharmony_ci} 681cb0ef41Sopenharmony_ci 691cb0ef41Sopenharmony_ciAddress RelocInfo::target_address() { 701cb0ef41Sopenharmony_ci DCHECK(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_) || IsWasmCall(rmode_)); 711cb0ef41Sopenharmony_ci return Assembler::target_address_at(pc_, constant_pool_); 721cb0ef41Sopenharmony_ci} 731cb0ef41Sopenharmony_ci 741cb0ef41Sopenharmony_ciAddress RelocInfo::target_address_address() { 751cb0ef41Sopenharmony_ci DCHECK(HasTargetAddressAddress()); 761cb0ef41Sopenharmony_ci return pc_; 771cb0ef41Sopenharmony_ci} 781cb0ef41Sopenharmony_ci 791cb0ef41Sopenharmony_ciAddress RelocInfo::constant_pool_entry_address() { UNREACHABLE(); } 801cb0ef41Sopenharmony_ci 811cb0ef41Sopenharmony_ciint RelocInfo::target_address_size() { return Assembler::kSpecialTargetSize; } 821cb0ef41Sopenharmony_ci 831cb0ef41Sopenharmony_ciHeapObject RelocInfo::target_object(PtrComprCageBase cage_base) { 841cb0ef41Sopenharmony_ci DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_) || 851cb0ef41Sopenharmony_ci IsDataEmbeddedObject(rmode_)); 861cb0ef41Sopenharmony_ci return HeapObject::cast(Object(ReadUnalignedValue<Address>(pc_))); 871cb0ef41Sopenharmony_ci} 881cb0ef41Sopenharmony_ci 891cb0ef41Sopenharmony_ciHandle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) { 901cb0ef41Sopenharmony_ci DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_) || 911cb0ef41Sopenharmony_ci IsDataEmbeddedObject(rmode_)); 921cb0ef41Sopenharmony_ci return Handle<HeapObject>::cast(ReadUnalignedValue<Handle<Object>>(pc_)); 931cb0ef41Sopenharmony_ci} 941cb0ef41Sopenharmony_ci 951cb0ef41Sopenharmony_civoid RelocInfo::set_target_object(Heap* heap, HeapObject target, 961cb0ef41Sopenharmony_ci WriteBarrierMode write_barrier_mode, 971cb0ef41Sopenharmony_ci ICacheFlushMode icache_flush_mode) { 981cb0ef41Sopenharmony_ci DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_) || 991cb0ef41Sopenharmony_ci IsDataEmbeddedObject(rmode_)); 1001cb0ef41Sopenharmony_ci WriteUnalignedValue(pc_, target.ptr()); 1011cb0ef41Sopenharmony_ci if (icache_flush_mode != SKIP_ICACHE_FLUSH) { 1021cb0ef41Sopenharmony_ci FlushInstructionCache(pc_, sizeof(Address)); 1031cb0ef41Sopenharmony_ci } 1041cb0ef41Sopenharmony_ci if (write_barrier_mode == UPDATE_WRITE_BARRIER && !host().is_null() && 1051cb0ef41Sopenharmony_ci !FLAG_disable_write_barriers) { 1061cb0ef41Sopenharmony_ci WriteBarrierForCode(host(), this, target); 1071cb0ef41Sopenharmony_ci } 1081cb0ef41Sopenharmony_ci} 1091cb0ef41Sopenharmony_ci 1101cb0ef41Sopenharmony_ciAddress RelocInfo::target_external_reference() { 1111cb0ef41Sopenharmony_ci DCHECK(rmode_ == RelocInfo::EXTERNAL_REFERENCE); 1121cb0ef41Sopenharmony_ci return ReadUnalignedValue<Address>(pc_); 1131cb0ef41Sopenharmony_ci} 1141cb0ef41Sopenharmony_ci 1151cb0ef41Sopenharmony_civoid RelocInfo::set_target_external_reference( 1161cb0ef41Sopenharmony_ci Address target, ICacheFlushMode icache_flush_mode) { 1171cb0ef41Sopenharmony_ci DCHECK(rmode_ == RelocInfo::EXTERNAL_REFERENCE); 1181cb0ef41Sopenharmony_ci WriteUnalignedValue(pc_, target); 1191cb0ef41Sopenharmony_ci if (icache_flush_mode != SKIP_ICACHE_FLUSH) { 1201cb0ef41Sopenharmony_ci FlushInstructionCache(pc_, sizeof(Address)); 1211cb0ef41Sopenharmony_ci } 1221cb0ef41Sopenharmony_ci} 1231cb0ef41Sopenharmony_ci 1241cb0ef41Sopenharmony_ciAddress RelocInfo::target_internal_reference() { 1251cb0ef41Sopenharmony_ci DCHECK(rmode_ == INTERNAL_REFERENCE); 1261cb0ef41Sopenharmony_ci return ReadUnalignedValue<Address>(pc_); 1271cb0ef41Sopenharmony_ci} 1281cb0ef41Sopenharmony_ci 1291cb0ef41Sopenharmony_ciAddress RelocInfo::target_internal_reference_address() { 1301cb0ef41Sopenharmony_ci DCHECK(rmode_ == INTERNAL_REFERENCE); 1311cb0ef41Sopenharmony_ci return pc_; 1321cb0ef41Sopenharmony_ci} 1331cb0ef41Sopenharmony_ci 1341cb0ef41Sopenharmony_ciAddress RelocInfo::target_runtime_entry(Assembler* origin) { 1351cb0ef41Sopenharmony_ci DCHECK(IsRuntimeEntry(rmode_)); 1361cb0ef41Sopenharmony_ci return ReadUnalignedValue<Address>(pc_); 1371cb0ef41Sopenharmony_ci} 1381cb0ef41Sopenharmony_ci 1391cb0ef41Sopenharmony_civoid RelocInfo::set_target_runtime_entry(Address target, 1401cb0ef41Sopenharmony_ci WriteBarrierMode write_barrier_mode, 1411cb0ef41Sopenharmony_ci ICacheFlushMode icache_flush_mode) { 1421cb0ef41Sopenharmony_ci DCHECK(IsRuntimeEntry(rmode_)); 1431cb0ef41Sopenharmony_ci if (target_address() != target) { 1441cb0ef41Sopenharmony_ci set_target_address(target, write_barrier_mode, icache_flush_mode); 1451cb0ef41Sopenharmony_ci } 1461cb0ef41Sopenharmony_ci} 1471cb0ef41Sopenharmony_ci 1481cb0ef41Sopenharmony_ciAddress RelocInfo::target_off_heap_target() { 1491cb0ef41Sopenharmony_ci DCHECK(IsOffHeapTarget(rmode_)); 1501cb0ef41Sopenharmony_ci return Assembler::target_address_at(pc_, constant_pool_); 1511cb0ef41Sopenharmony_ci} 1521cb0ef41Sopenharmony_ci 1531cb0ef41Sopenharmony_civoid RelocInfo::WipeOut() { 1541cb0ef41Sopenharmony_ci if (IsFullEmbeddedObject(rmode_) || IsExternalReference(rmode_) || 1551cb0ef41Sopenharmony_ci IsInternalReference(rmode_)) { 1561cb0ef41Sopenharmony_ci WriteUnalignedValue(pc_, kNullAddress); 1571cb0ef41Sopenharmony_ci } else if (IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_) || 1581cb0ef41Sopenharmony_ci IsOffHeapTarget(rmode_)) { 1591cb0ef41Sopenharmony_ci // Effectively write zero into the relocation. 1601cb0ef41Sopenharmony_ci Assembler::set_target_address_at(pc_, constant_pool_, 1611cb0ef41Sopenharmony_ci pc_ + sizeof(int32_t)); 1621cb0ef41Sopenharmony_ci } else { 1631cb0ef41Sopenharmony_ci UNREACHABLE(); 1641cb0ef41Sopenharmony_ci } 1651cb0ef41Sopenharmony_ci} 1661cb0ef41Sopenharmony_ci 1671cb0ef41Sopenharmony_civoid Assembler::emit(uint32_t x) { 1681cb0ef41Sopenharmony_ci WriteUnalignedValue(reinterpret_cast<Address>(pc_), x); 1691cb0ef41Sopenharmony_ci pc_ += sizeof(uint32_t); 1701cb0ef41Sopenharmony_ci} 1711cb0ef41Sopenharmony_ci 1721cb0ef41Sopenharmony_civoid Assembler::emit_q(uint64_t x) { 1731cb0ef41Sopenharmony_ci WriteUnalignedValue(reinterpret_cast<Address>(pc_), x); 1741cb0ef41Sopenharmony_ci pc_ += sizeof(uint64_t); 1751cb0ef41Sopenharmony_ci} 1761cb0ef41Sopenharmony_ci 1771cb0ef41Sopenharmony_civoid Assembler::emit(Handle<HeapObject> handle) { 1781cb0ef41Sopenharmony_ci emit(handle.address(), RelocInfo::FULL_EMBEDDED_OBJECT); 1791cb0ef41Sopenharmony_ci} 1801cb0ef41Sopenharmony_ci 1811cb0ef41Sopenharmony_civoid Assembler::emit(uint32_t x, RelocInfo::Mode rmode) { 1821cb0ef41Sopenharmony_ci if (!RelocInfo::IsNoInfo(rmode)) { 1831cb0ef41Sopenharmony_ci RecordRelocInfo(rmode); 1841cb0ef41Sopenharmony_ci } 1851cb0ef41Sopenharmony_ci emit(x); 1861cb0ef41Sopenharmony_ci} 1871cb0ef41Sopenharmony_ci 1881cb0ef41Sopenharmony_civoid Assembler::emit(Handle<Code> code, RelocInfo::Mode rmode) { 1891cb0ef41Sopenharmony_ci emit(code.address(), rmode); 1901cb0ef41Sopenharmony_ci} 1911cb0ef41Sopenharmony_ci 1921cb0ef41Sopenharmony_civoid Assembler::emit(const Immediate& x) { 1931cb0ef41Sopenharmony_ci if (x.rmode_ == RelocInfo::INTERNAL_REFERENCE) { 1941cb0ef41Sopenharmony_ci Label* label = reinterpret_cast<Label*>(x.immediate()); 1951cb0ef41Sopenharmony_ci emit_code_relative_offset(label); 1961cb0ef41Sopenharmony_ci return; 1971cb0ef41Sopenharmony_ci } 1981cb0ef41Sopenharmony_ci if (!RelocInfo::IsNoInfo(x.rmode_)) RecordRelocInfo(x.rmode_); 1991cb0ef41Sopenharmony_ci if (x.is_heap_object_request()) { 2001cb0ef41Sopenharmony_ci RequestHeapObject(x.heap_object_request()); 2011cb0ef41Sopenharmony_ci emit(0); 2021cb0ef41Sopenharmony_ci return; 2031cb0ef41Sopenharmony_ci } 2041cb0ef41Sopenharmony_ci emit(x.immediate()); 2051cb0ef41Sopenharmony_ci} 2061cb0ef41Sopenharmony_ci 2071cb0ef41Sopenharmony_civoid Assembler::emit_code_relative_offset(Label* label) { 2081cb0ef41Sopenharmony_ci if (label->is_bound()) { 2091cb0ef41Sopenharmony_ci int32_t pos; 2101cb0ef41Sopenharmony_ci pos = label->pos() + Code::kHeaderSize - kHeapObjectTag; 2111cb0ef41Sopenharmony_ci emit(pos); 2121cb0ef41Sopenharmony_ci } else { 2131cb0ef41Sopenharmony_ci emit_disp(label, Displacement::CODE_RELATIVE); 2141cb0ef41Sopenharmony_ci } 2151cb0ef41Sopenharmony_ci} 2161cb0ef41Sopenharmony_ci 2171cb0ef41Sopenharmony_civoid Assembler::emit_b(Immediate x) { 2181cb0ef41Sopenharmony_ci DCHECK(x.is_int8() || x.is_uint8()); 2191cb0ef41Sopenharmony_ci uint8_t value = static_cast<uint8_t>(x.immediate()); 2201cb0ef41Sopenharmony_ci *pc_++ = value; 2211cb0ef41Sopenharmony_ci} 2221cb0ef41Sopenharmony_ci 2231cb0ef41Sopenharmony_civoid Assembler::emit_w(const Immediate& x) { 2241cb0ef41Sopenharmony_ci DCHECK(RelocInfo::IsNoInfo(x.rmode_)); 2251cb0ef41Sopenharmony_ci uint16_t value = static_cast<uint16_t>(x.immediate()); 2261cb0ef41Sopenharmony_ci WriteUnalignedValue(reinterpret_cast<Address>(pc_), value); 2271cb0ef41Sopenharmony_ci pc_ += sizeof(uint16_t); 2281cb0ef41Sopenharmony_ci} 2291cb0ef41Sopenharmony_ci 2301cb0ef41Sopenharmony_ciAddress Assembler::target_address_at(Address pc, Address constant_pool) { 2311cb0ef41Sopenharmony_ci return pc + sizeof(int32_t) + ReadUnalignedValue<int32_t>(pc); 2321cb0ef41Sopenharmony_ci} 2331cb0ef41Sopenharmony_ci 2341cb0ef41Sopenharmony_civoid Assembler::set_target_address_at(Address pc, Address constant_pool, 2351cb0ef41Sopenharmony_ci Address target, 2361cb0ef41Sopenharmony_ci ICacheFlushMode icache_flush_mode) { 2371cb0ef41Sopenharmony_ci WriteUnalignedValue(pc, target - (pc + sizeof(int32_t))); 2381cb0ef41Sopenharmony_ci if (icache_flush_mode != SKIP_ICACHE_FLUSH) { 2391cb0ef41Sopenharmony_ci FlushInstructionCache(pc, sizeof(int32_t)); 2401cb0ef41Sopenharmony_ci } 2411cb0ef41Sopenharmony_ci} 2421cb0ef41Sopenharmony_ci 2431cb0ef41Sopenharmony_civoid Assembler::deserialization_set_special_target_at( 2441cb0ef41Sopenharmony_ci Address instruction_payload, Code code, Address target) { 2451cb0ef41Sopenharmony_ci set_target_address_at(instruction_payload, 2461cb0ef41Sopenharmony_ci !code.is_null() ? code.constant_pool() : kNullAddress, 2471cb0ef41Sopenharmony_ci target); 2481cb0ef41Sopenharmony_ci} 2491cb0ef41Sopenharmony_ci 2501cb0ef41Sopenharmony_ciint Assembler::deserialization_special_target_size( 2511cb0ef41Sopenharmony_ci Address instruction_payload) { 2521cb0ef41Sopenharmony_ci return kSpecialTargetSize; 2531cb0ef41Sopenharmony_ci} 2541cb0ef41Sopenharmony_ci 2551cb0ef41Sopenharmony_ciDisplacement Assembler::disp_at(Label* L) { 2561cb0ef41Sopenharmony_ci return Displacement(long_at(L->pos())); 2571cb0ef41Sopenharmony_ci} 2581cb0ef41Sopenharmony_ci 2591cb0ef41Sopenharmony_civoid Assembler::disp_at_put(Label* L, Displacement disp) { 2601cb0ef41Sopenharmony_ci long_at_put(L->pos(), disp.data()); 2611cb0ef41Sopenharmony_ci} 2621cb0ef41Sopenharmony_ci 2631cb0ef41Sopenharmony_civoid Assembler::emit_disp(Label* L, Displacement::Type type) { 2641cb0ef41Sopenharmony_ci Displacement disp(L, type); 2651cb0ef41Sopenharmony_ci L->link_to(pc_offset()); 2661cb0ef41Sopenharmony_ci emit(static_cast<int>(disp.data())); 2671cb0ef41Sopenharmony_ci} 2681cb0ef41Sopenharmony_ci 2691cb0ef41Sopenharmony_civoid Assembler::emit_near_disp(Label* L) { 2701cb0ef41Sopenharmony_ci byte disp = 0x00; 2711cb0ef41Sopenharmony_ci if (L->is_near_linked()) { 2721cb0ef41Sopenharmony_ci int offset = L->near_link_pos() - pc_offset(); 2731cb0ef41Sopenharmony_ci DCHECK(is_int8(offset)); 2741cb0ef41Sopenharmony_ci disp = static_cast<byte>(offset & 0xFF); 2751cb0ef41Sopenharmony_ci } 2761cb0ef41Sopenharmony_ci L->link_to(pc_offset(), Label::kNear); 2771cb0ef41Sopenharmony_ci *pc_++ = disp; 2781cb0ef41Sopenharmony_ci} 2791cb0ef41Sopenharmony_ci 2801cb0ef41Sopenharmony_civoid Assembler::deserialization_set_target_internal_reference_at( 2811cb0ef41Sopenharmony_ci Address pc, Address target, RelocInfo::Mode mode) { 2821cb0ef41Sopenharmony_ci WriteUnalignedValue(pc, target); 2831cb0ef41Sopenharmony_ci} 2841cb0ef41Sopenharmony_ci 2851cb0ef41Sopenharmony_civoid Operand::set_sib(ScaleFactor scale, Register index, Register base) { 2861cb0ef41Sopenharmony_ci DCHECK_EQ(len_, 1); 2871cb0ef41Sopenharmony_ci DCHECK_EQ(scale & -4, 0); 2881cb0ef41Sopenharmony_ci // Use SIB with no index register only for base esp. 2891cb0ef41Sopenharmony_ci DCHECK(index != esp || base == esp); 2901cb0ef41Sopenharmony_ci buf_[1] = scale << 6 | index.code() << 3 | base.code(); 2911cb0ef41Sopenharmony_ci len_ = 2; 2921cb0ef41Sopenharmony_ci} 2931cb0ef41Sopenharmony_ci 2941cb0ef41Sopenharmony_civoid Operand::set_disp8(int8_t disp) { 2951cb0ef41Sopenharmony_ci DCHECK(len_ == 1 || len_ == 2); 2961cb0ef41Sopenharmony_ci *reinterpret_cast<int8_t*>(&buf_[len_++]) = disp; 2971cb0ef41Sopenharmony_ci} 2981cb0ef41Sopenharmony_ci 2991cb0ef41Sopenharmony_ci} // namespace internal 3001cb0ef41Sopenharmony_ci} // namespace v8 3011cb0ef41Sopenharmony_ci 3021cb0ef41Sopenharmony_ci#endif // V8_CODEGEN_IA32_ASSEMBLER_IA32_INL_H_ 303