5#ifndef V8_CODEGEN_LOONG64_ASSEMBLER_LOONG64_H_
6#define V8_CODEGEN_LOONG64_ASSEMBLER_LOONG64_H_
25class SafepointTableBuilder;
45 :
Operand(static_cast<intptr_t>(value.ptr())) {}
123 std::unique_ptr<AssemblerBuffer> = {});
126 std::unique_ptr<AssemblerBuffer> buffer = {})
132 static constexpr int kNoHandlerTable = 0;
136 int handler_table_offset);
142 GetCode(isolate, desc, kNoSafepointTable, kNoHandlerTable);
155 return static_cast<int>(pc_for_safepoint_ - buffer_start_);
196 return branch_offset_helper(
L, OffsetSize::kOffset16);
199 return branch_offset_helper(
L, OffsetSize::kOffset21);
202 return branch_offset_helper(
L, OffsetSize::kOffset26);
205 return branch_offset(
L) >> 2;
208 return branch_offset21(
L) >> 2;
211 return branch_offset26(
L) >> 2;
213 uint64_t jump_address(
Label* L);
215 uint64_t branch_long_offset(
Label* L);
219 void label_at_put(
Label* L,
int at_offset);
227 return target_address_at(
pc);
230 Address constant_pool) {
231 return target_compressed_address_at(
pc);
234 Address
pc, Address constant_pool, Address target,
237 set_target_value_at(
pc, target, jit_allocation, icache_flush_mode);
240 Address
pc, Address constant_pool,
Tagged_t target,
243 set_target_compressed_value_at(
pc, target, jit_allocation,
248 Address constant_pool);
256 Address
pc, uint64_t target,
260 Address
pc, uint32_t target,
268 Address instruction_payload);
276 Address
pc, Address constant_pool);
278 Address constant_pool);
283 Address
pc, Address constant_pool, uint32_t new_constant,
293 static constexpr int kSpecialTargetSize = 0;
300 static constexpr int kInstructionsFor64BitConstant = 4;
303 static constexpr int kMax16BranchOffset = (1 << (18 - 1)) - 1;
306 static constexpr int kMax21BranchOffset = (1 << (23 - 1)) - 1;
309 static constexpr int kMax26BranchOffset = (1 << (28 - 1)) - 1;
316 return &scratch_fpregister_list_;
339 PROPERTY_ACCESS_INLINED,
340 PROPERTY_ACCESS_INLINED_CONTEXT,
341 PROPERTY_ACCESS_INLINED_CONTEXT_DONT_DELETE,
344 FIRST_IC_MARKER = PROPERTY_ACCESS_INLINED,
349 void nop(
unsigned int type = 0) {
351 andi(zero_reg, zero_reg, type);
357 inline void b(
Label* L) {
b(shifted_branch_offset26(
L)); }
363 beq(rj, rd, shifted_branch_offset(
L));
367 bne(rj, rd, shifted_branch_offset(
L));
371 blt(rj, rd, shifted_branch_offset(
L));
375 bge(rj, rd, shifted_branch_offset(
L));
379 bltu(rj, rd, shifted_branch_offset(
L));
383 bgeu(rj, rd, shifted_branch_offset(
L));
387 beqz(rj, shifted_branch_offset21(
L));
391 bnez(rj, shifted_branch_offset21(
L));
398 bceqz(cj, shifted_branch_offset21(
L));
402 bcnez(cj, shifted_branch_offset21(
L));
603 void break_(uint32_t code,
bool break_as_stop =
false);
604 void stop(uint32_t code = kMaxStopCode);
740 assem_->StartBlockTrampolinePool();
757 assem_->StartBlockGrowBuffer();
778 void db(uint8_t data);
779 void dd(uint32_t data);
780 void dq(uint64_t data);
781 void dp(uintptr_t data) { dq(data); }
786 void BlockTrampolinePoolFor(
int instructions);
791 inline bool overflow()
const {
return pc_ >= reloc_info_writer.pos() - kGap; }
795 return reloc_info_writer.pos() -
pc_;
803 i->SetInstructionBits(
instr, jit_allocation);
806 return *
reinterpret_cast<Instr*
>(buffer_start_ +
pos);
811 i->SetInstructionBits(
instr, jit_allocation);
861 void CheckTrampolinePool();
873 inline static void set_target_internal_reference_encoded_at(Address
pc,
879 int target_at(
int pos,
bool is_internal);
882 void target_at_put(
int pos,
int target_pos,
bool is_internal);
892 if (no_trampoline_pool_before_ <
pc_offset)
899 trampoline_pool_blocked_nesting_--;
900 if (trampoline_pool_blocked_nesting_ == 0) {
901 CheckTrampolinePoolQuick(1);
906 return trampoline_pool_blocked_nesting_ > 0;
915 DCHECK(!block_buffer_growth_);
916 block_buffer_growth_ =
true;
920 DCHECK(block_buffer_growth_);
921 block_buffer_growth_ =
false;
928 CheckTrampolinePool();
936 static const int kMaximalBufferSize = 512 *
MB;
940 static constexpr int kBufferCheckInterval = 1 * KB / 2;
947 static constexpr int kGap = 64;
948 static_assert(AssemblerBase::kMinimalBufferSize >= 2 * kGap);
953 static constexpr int kCheckConstIntervalInst = 32;
954 static constexpr int kCheckConstInterval =
971 static constexpr int kMaxRelocSize = RelocInfoWriter::kMaxSize;
981 inline void emit(uint64_t
x);
982 template <
typename T>
983 inline void EmitHelper(T
x);
984 inline void EmitHelper(
Instr x);
1021 int32_t value_bits);
1027 void next(
Label* L,
bool is_internal);
1042 free_slot_count_ = 0;
1048 free_slot_count_ = slot_count;
1049 end_ =
start + slot_count * kTrampolineSlotsSize;
1054 int trampoline_slot = kInvalidSlotPos;
1055 if (free_slot_count_ <= 0) {
1062 trampoline_slot = next_slot_;
1064 next_slot_ += kTrampolineSlotsSize;
1066 return trampoline_slot;
1076 int32_t get_trampoline_entry(int32_t
pos);
1084 static constexpr int kInvalidSlotPos = -1;
1090 return internal_reference_positions_.find(
L->pos()) !=
1091 internal_reference_positions_.end();
1096 bool prev_instr_compact_branch_ =
false;
1106 RegList scratch_register_list_;
1129 :
available_(assembler->GetScratchRegisterList()),
1130 availablefp_(assembler->GetScratchFPRegisterList()),
1132 old_availablefp_(*availablefp_) {}
1136 *availablefp_ = old_availablefp_;
1144 return availablefp_->PopFirst();
DISALLOW_IMPLICIT_CONSTRUCTORS(BlockGrowBufferScope)
BlockGrowBufferScope(Assembler *assem)
DISALLOW_IMPLICIT_CONSTRUCTORS(BlockTrampolinePoolScope)
BlockTrampolinePoolScope(Assembler *assem)
~BlockTrampolinePoolScope()
Trampoline(int start, int slot_count)
void bind_to(Label *L, int pos)
void ctz_d(Register rd, Register rj)
void ftintrm_w_d(FPURegister fd, FPURegister fj)
static void set_target_value_at(Address pc, uint64_t target, WritableJitAllocation *jit_allocation=nullptr, ICacheFlushMode icache_flush_mode=FLUSH_ICACHE_IF_NEEDED)
void mod_du(Register rd, Register rj, Register rk)
void amadd_db_d(Register rd, Register rk, Register rj)
void ftint_w_s(FPURegister fd, FPURegister fj)
void fcvt_d_s(FPURegister fd, FPURegister fj)
void lu12i_w(Register rd, int32_t si20)
void fmsub_d(FPURegister fd, FPURegister fj, FPURegister fk, FPURegister fa)
void fcvt_s_d(FPURegister fd, FPURegister fj)
void GetCode(LocalIsolate *isolate, CodeDesc *desc)
void bitrev_4b(Register rd, Register rj)
void ammin_wu(Register rd, Register rk, Register rj)
void GenCmp(Opcode opcode, FPUCondition cond, FPURegister fk, FPURegister fj, CFRegister cd)
void rotri_d(Register rd, Register rj, int32_t ui6)
void ammax_wu(Register rd, Register rk, Register rj)
void frint_d(FPURegister fd, FPURegister fj)
bool is_buffer_growth_blocked() const
bool is_internal_reference(Label *L)
void addu16i_d(Register rd, Register rj, int32_t si16)
void ld_d(Register rd, Register rj, int32_t si12)
void clz_d(Register rd, Register rj)
void ldptr_w(Register rd, Register rj, int32_t si14)
static bool IsJ(Instr instr)
void fmax_d(FPURegister fd, FPURegister fj, FPURegister fk)
void frsqrt_d(FPURegister fd, FPURegister fj)
void rotri_w(Register rd, Register rj, int32_t ui5)
void masknez(Register rd, Register rj, Register rk)
static bool IsJump(Instr instr)
void fsqrt_d(FPURegister fd, FPURegister fj)
void fmov_d(FPURegister fd, FPURegister fj)
void fdiv_s(FPURegister fd, FPURegister fj, FPURegister fk)
void ftintrz_w_d(FPURegister fd, FPURegister fj)
void mulh_d(Register rd, Register rj, Register rk)
void sll_w(Register rd, Register rj, Register rk)
void fldx_s(FPURegister fd, Register rj, Register rk)
void alsl_w(Register rd, Register rj, Register rk, int32_t sa2)
void bgeu(Register rj, Register rd, int32_t offset)
void ammin_w(Register rd, Register rk, Register rj)
void slli_w(Register rd, Register rj, int32_t ui5)
void bstrpick_w(Register rd, Register rj, int32_t msbw, int32_t lsbw)
void bstrins_d(Register rd, Register rj, int32_t msbd, int32_t lsbd)
bool is_trampoline_emitted() const
void ldptr_d(Register rd, Register rj, int32_t si14)
void beqz(Register rj, int32_t offset)
void fld_s(FPURegister fd, Register rj, int32_t si12)
void GenRegister(Opcode opcode, FPURegister fj, Register rd)
void stx_b(Register rd, Register rj, Register rk)
void ld_hu(Register rd, Register rj, int32_t si12)
void fabs_d(FPURegister fd, FPURegister fj)
void EndBlockTrampolinePool()
void ammin_db_wu(Register rd, Register rk, Register rj)
void mul_d(Register rd, Register rj, Register rk)
void mod_d(Register rd, Register rj, Register rk)
void GenRegister(Opcode opcode, CFRegister cj, FPURegister fd)
void bytepick_d(Register rd, Register rj, Register rk, int32_t sa3)
static uint32_t GetRk(Instr instr)
void srl_d(Register rd, Register rj, Register rk)
void fneg_s(FPURegister fd, FPURegister fj)
void clo_w(Register rd, Register rj)
void ld_w(Register rd, Register rj, int32_t si12)
void ext_w_b(Register rd, Register rj)
void movfrh2gr_s(Register rd, FPURegister fj)
static uint32_t GetOpcodeField(Instr instr)
void movfr2gr_s(Register rd, FPURegister fj)
void GenSel(Opcode opcode, CFRegister ca, FPURegister fk, FPURegister fj, FPURegister rd)
void fclass_d(FPURegister fd, FPURegister fj)
void fclass_s(FPURegister fd, FPURegister fj)
void flogb_s(FPURegister fd, FPURegister fj)
static bool IsBne(Instr instr)
Assembler(const MaybeAssemblerZone &, const AssemblerOptions &options, std::unique_ptr< AssemblerBuffer > buffer={})
void bcnez(CFRegister cj, int32_t si21)
void stx_h(Register rd, Register rj, Register rk)
void ammax_db_du(Register rd, Register rk, Register rj)
static int deserialization_special_target_size(Address instruction_payload)
void stptr_w(Register rd, Register rj, int32_t si14)
void ftintrp_l_d(FPURegister fd, FPURegister fj)
void fscaleb_s(FPURegister fd, FPURegister fj, FPURegister fk)
static void RelocateRelativeReference(RelocInfo::Mode rmode, Address pc, intptr_t pc_delta, WritableJitAllocation *jit_allocation=nullptr)
void AllocateAndInstallRequestedHeapNumbers(LocalIsolate *isolate)
void srli_w(Register rd, Register rj, int32_t ui5)
void movfr2gr_d(Register rd, FPURegister fj)
void bne(Register rj, Register rd, int32_t offset)
void orn(Register rd, Register rj, Register rk)
bool internal_trampoline_exception_
void EmittedCompactBranchInstruction()
void fnmadd_d(FPURegister fd, FPURegister fj, FPURegister fk, FPURegister fa)
void movcf2gr(Register rd, CFRegister cj)
void div_w(Register rd, Register rj, Register rk)
void GenB(Opcode opcode, CFRegister cj, int32_t si21, bool isEq)
void alsl_d(Register rd, Register rj, Register rk, int32_t sa2)
static uint32_t GetFunctionField(Instr instr)
void beq(Register rj, Register rd, Label *L)
static void deserialization_set_target_internal_reference_at(Address pc, Address target, WritableJitAllocation &jit_allocation, RelocInfo::Mode mode=RelocInfo::INTERNAL_REFERENCE)
void srai_w(Register rd, Register rj, int32_t ui5)
void fsub_s(FPURegister fd, FPURegister fj, FPURegister fk)
void amand_db_w(Register rd, Register rk, Register rj)
void ftintrp_w_d(FPURegister fd, FPURegister fj)
void bltu(Register rj, Register rd, Label *L)
void or_(Register rd, Register rj, Register rk)
void revb_2h(Register rd, Register rj)
static Address target_address_at(Address pc)
void movgr2fr_d(FPURegister fd, Register rj)
void StartBlockGrowBuffer()
bool is_trampoline_pool_blocked() const
void amxor_db_w(Register rd, Register rk, Register rj)
void slti(Register rd, Register rj, int32_t si12)
static uint32_t GetFunction(Instr instr)
void StartBlockTrampolinePool()
void revh_d(Register rd, Register rj)
void nop(unsigned int type=0)
void ldx_d(Register rd, Register rj, Register rk)
void movfcsr2gr(Register rd, FPUControlRegister fcsr=FCSR0)
static uint32_t GetSa2Field(Instr instr)
void div_wu(Register rd, Register rj, Register rk)
void lu52i_d(Register rd, Register rj, int32_t si12)
void fcopysign_s(FPURegister fd, FPURegister fj, FPURegister fk)
int32_t shifted_branch_offset26(Label *L)
void fsub_d(FPURegister fd, FPURegister fj, FPURegister fk)
int InstructionsGeneratedSince(Label *label)
void fmax_s(FPURegister fd, FPURegister fj, FPURegister fk)
static bool IsLu52i_d(Instr instr)
bool has_exception() const
void bgeu(Register rj, Register rd, Label *L)
int32_t shifted_branch_offset(Label *L)
void GenBJ(Opcode opcode, Register rj, Register rd, int32_t si16)
static bool IsOri(Instr instr)
void amadd_w(Register rd, Register rk, Register rj)
void blt(Register rj, Register rd, int32_t offset)
void ld_wu(Register rd, Register rj, int32_t si12)
void frecip_s(FPURegister fd, FPURegister fj)
void fmul_s(FPURegister fd, FPURegister fj, FPURegister fk)
void movgr2cf(CFRegister cd, Register rj)
void GenRegister(Opcode opcode, FPURegister fj, CFRegister cd)
void clo_d(Register rd, Register rj)
void bitrev_w(Register rd, Register rj)
intptr_t available_space() const
static uint32_t GetLabelConst(Instr instr)
DoubleRegList scratch_fpregister_list_
void ammin_db_d(Register rd, Register rk, Register rj)
static bool IsPcAddi(Instr instr)
void st_w(Register rd, Register rj, int32_t si12)
int32_t branch_offset26(Label *L)
void amand_d(Register rd, Register rk, Register rj)
void xor_(Register rd, Register rj, Register rk)
void movfr2cf(CFRegister cd, FPURegister fj)
int last_trampoline_pool_end_
static void set_uint32_constant_at(Address pc, Address constant_pool, uint32_t new_constant, WritableJitAllocation *jit_allocation, ICacheFlushMode icache_flush_mode=FLUSH_ICACHE_IF_NEEDED)
void ammin_db_du(Register rd, Register rk, Register rj)
void bnez(Register rj, Label *L)
void fcmp_cond_s(FPUCondition cc, FPURegister fj, FPURegister fk, CFRegister cd)
void movgr2fr_w(FPURegister fd, Register rj)
void GenImm(Opcode opcode, int32_t bit15)
static bool IsBz(Instr instr)
void revb_2w(Register rd, Register rj)
void fcmp_cond_d(FPUCondition cc, FPURegister fj, FPURegister fk, CFRegister cd)
void GenB(Opcode opcode, int32_t si26)
void GenImm(Opcode opcode, int32_t bit20, Register rd)
void ftintrp_l_s(FPURegister fd, FPURegister fj)
void RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data=0)
void ldx_wu(Register rd, Register rj, Register rk)
void ftintrz_l_s(FPURegister fd, FPURegister fj)
void bstrpick_d(Register rd, Register rj, int32_t msbd, int32_t lsbd)
void ammin_db_w(Register rd, Register rk, Register rj)
void jirl(Register rd, Register rj, int32_t offset)
void revb_d(Register rd, Register rj)
void ammax_d(Register rd, Register rk, Register rj)
void mul_w(Register rd, Register rj, Register rk)
void ammax_db_d(Register rd, Register rk, Register rj)
static uint32_t uint32_constant_at(Address pc, Address constant_pool)
void xori(Register rd, Register rj, int32_t ui12)
void mulh_wu(Register rd, Register rj, Register rk)
void fnmsub_s(FPURegister fd, FPURegister fj, FPURegister fk, FPURegister fa)
void fdiv_d(FPURegister fd, FPURegister fj, FPURegister fk)
void GenRegister(Opcode opcode, Register rj, FPUControlRegister fd)
void print(const Label *L)
void GenImm(Opcode opcode, int32_t bit3, Register rk, Register rj, Register rd)
static void set_target_compressed_value_at(Address pc, uint32_t target, WritableJitAllocation *jit_allocation=nullptr, ICacheFlushMode icache_flush_mode=FLUSH_ICACHE_IF_NEEDED)
void pcaddu18i(Register rd, int32_t si20)
void set_pc_for_safepoint()
void srai_d(Register rd, Register rj, int32_t ui6)
void GenRegister(Opcode opcode, FPURegister fk, FPURegister fj, FPURegister fd)
static uint32_t GetRdField(Instr instr)
RegList * GetScratchRegisterList()
void ffint_s_w(FPURegister fd, FPURegister fj)
void ftintrne_w_s(FPURegister fd, FPURegister fj)
void ftintrz_w_s(FPURegister fd, FPURegister fj)
void ld_h(Register rd, Register rj, int32_t si12)
void amswap_w(Register rd, Register rk, Register rj)
void pcalau12i(Register rd, int32_t si20)
void fcopysign_d(FPURegister fd, FPURegister fj, FPURegister fk)
static Register GetRdReg(Instr instr)
void fscaleb_d(FPURegister fd, FPURegister fj, FPURegister fk)
void amswap_db_d(Register rd, Register rk, Register rj)
void fsqrt_s(FPURegister fd, FPURegister fj)
void add_w(Register rd, Register rj, Register rk)
void fabs_s(FPURegister fd, FPURegister fj)
void sub_w(Register rd, Register rj, Register rk)
void ftintrm_w_s(FPURegister fd, FPURegister fj)
void nor(Register rd, Register rj, Register rk)
static Tagged_t target_compressed_address_at(Address pc, Address constant_pool)
void GenImm(Opcode opcode, int32_t bit12, Register rj, FPURegister fd)
void mod_w(Register rd, Register rj, Register rk)
static bool IsAddImmediate(Instr instr)
static Address target_address_at(Address pc, Address constant_pool)
int32_t shifted_branch_offset21(Label *L)
void bltu(Register rj, Register rd, int32_t offset)
void ld_bu(Register rd, Register rj, int32_t si12)
void ftintrne_w_d(FPURegister fd, FPURegister fj)
void fmin_d(FPURegister fd, FPURegister fj, FPURegister fk)
void amor_w(Register rd, Register rk, Register rj)
void andn(Register rd, Register rj, Register rk)
void GenRegister(Opcode opcode, CFRegister cj, Register rd)
void ammin_d(Register rd, Register rk, Register rj)
void sra_d(Register rd, Register rj, Register rk)
static uint32_t GetSa3(Instr instr)
void fmov_s(FPURegister fd, FPURegister fj)
void ftintrne_l_s(FPURegister fd, FPURegister fj)
void amand_w(Register rd, Register rk, Register rj)
void andi(Register rd, Register rj, int32_t ui12)
void st_b(Register rd, Register rj, int32_t si12)
uint64_t jump_offset(Label *L)
void rotr_d(Register rd, Register rj, Register rk)
void fnmadd_s(FPURegister fd, FPURegister fj, FPURegister fk, FPURegister fa)
static bool IsBranch(Instr instr)
void st_h(Register rd, Register rj, int32_t si12)
void fnmsub_d(FPURegister fd, FPURegister fj, FPURegister fk, FPURegister fa)
void amand_db_d(Register rd, Register rk, Register rj)
int pc_offset_for_safepoint()
void fld_d(FPURegister fd, Register rj, int32_t si12)
void sc_d(Register rd, Register rj, int32_t si14)
void stx_d(Register rd, Register rj, Register rk)
void movgr2fcsr(Register rj, FPUControlRegister fcsr=FCSR0)
static uint32_t GetRkField(Instr instr)
void ftintrm_l_d(FPURegister fd, FPURegister fj)
void fmaxa_d(FPURegister fd, FPURegister fj, FPURegister fk)
void amswap_d(Register rd, Register rk, Register rj)
void frint_s(FPURegister fd, FPURegister fj)
void sltu(Register rd, Register rj, Register rk)
void bne(Register rj, Register rd, Label *L)
void ld_b(Register rd, Register rj, int32_t si12)
void amxor_w(Register rd, Register rk, Register rj)
void GenRegister(Opcode opcode, FPURegister fa, FPURegister fk, FPURegister fj, FPURegister fd)
void amswap_db_w(Register rd, Register rk, Register rj)
std::set< int64_t > internal_reference_positions_
void GetCode(Isolate *isolate, CodeDesc *desc)
void GenRegister(Opcode opcode, FPURegister fj, FPURegister fd)
static Instr SetAddImmediateOffset(Instr instr, int16_t offset)
void bstrins_w(Register rd, Register rj, int32_t msbw, int32_t lsbw)
static Register GetRkReg(Instr instr)
void sc_w(Register rd, Register rj, int32_t si14)
void bytepick_w(Register rd, Register rj, Register rk, int32_t sa2)
void sra_w(Register rd, Register rj, Register rk)
void ammax_w(Register rd, Register rk, Register rj)
static uint32_t GetRd(Instr instr)
void revb_4h(Register rd, Register rj)
void fstx_s(FPURegister fd, Register rj, Register rk)
void ffint_s_l(FPURegister fd, FPURegister fj)
void ammin_du(Register rd, Register rk, Register rj)
void bge(Register rj, Register rd, Label *L)
static uint32_t target_compressed_address_at(Address pc)
void GenRegister(Opcode opcode, FPUControlRegister fj, Register rd)
void add_d(Register rd, Register rj, Register rk)
void GenImm(Opcode opcode, int32_t bit6m, int32_t bit6l, Register rj, Register rd)
void mulw_d_wu(Register rd, Register rj, Register rk)
static void instr_at_put(Address pc, Instr instr, WritableJitAllocation *jit_allocation=nullptr)
void revh_2w(Register rd, Register rj)
void fmina_s(FPURegister fd, FPURegister fj, FPURegister fk)
void MaybeEmitOutOfLineConstantPool()
int no_trampoline_pool_before_
static uint32_t GetSa2(Instr instr)
void GenRegister(Opcode opcode, Register rj, FPURegister fd)
void addi_d(Register rd, Register rj, int32_t si12)
void GenRegister(Opcode opcode, Register rk, Register rj, FPURegister fd)
void fmin_s(FPURegister fd, FPURegister fj, FPURegister fk)
void fsel(CFRegister ca, FPURegister fd, FPURegister fj, FPURegister fk)
void ammax_db_wu(Register rd, Register rk, Register rj)
void beqz(Register rj, Label *L)
void fneg_d(FPURegister fd, FPURegister fj)
void fst_d(FPURegister fd, Register rj, int32_t si12)
uint8_t * pc_for_safepoint_
void ll_w(Register rd, Register rj, int32_t si14)
void blt(Register rj, Register rd, Label *L)
void fst_s(FPURegister fd, Register rj, int32_t si12)
static Instr instr_at(Address pc)
void GenRegister(Opcode opcode, Register rj, CFRegister cd)
void fldx_d(FPURegister fd, Register rj, Register rk)
static bool IsEmittedConstant(Instr instr)
void GenImm(Opcode opcode, int32_t value, Register rj, Register rd, int32_t value_bits)
void ll_d(Register rd, Register rj, int32_t si14)
void sltui(Register rd, Register rj, int32_t si12)
static bool IsLu32i_d(Instr instr)
void bge(Register rj, Register rd, int32_t offset)
void fmadd_d(FPURegister fd, FPURegister fj, FPURegister fk, FPURegister fa)
void bcnez(CFRegister cj, Label *L)
void ctz_w(Register rd, Register rj)
void ffint_d_l(FPURegister fd, FPURegister fj)
V8_INLINE Handle< Code > relative_code_target_object_handle_at(Address pc_) const
void ori(Register rd, Register rj, int32_t ui12)
static bool IsMov(Instr instr, Register rd, Register rs)
void amor_db_d(Register rd, Register rk, Register rj)
void ammax_db_w(Register rd, Register rk, Register rj)
int unbound_labels_count_
void fmul_d(FPURegister fd, FPURegister fj, FPURegister fk)
DoubleRegList * GetScratchFPRegisterList()
static bool IsLu12i_w(Instr instr)
void GetCode(LocalIsolate *isolate, CodeDesc *desc, SafepointTableBuilderBase *safepoint_table_builder, int handler_table_offset)
void cto_d(Register rd, Register rj)
static uint32_t GetRj(Instr instr)
void ffint_d_w(FPURegister fd, FPURegister fj)
void mulh_w(Register rd, Register rj, Register rk)
void bitrev_d(Register rd, Register rj)
void lu32i_d(Register rd, int32_t si20)
void ftintrm_l_s(FPURegister fd, FPURegister fj)
void ldx_b(Register rd, Register rj, Register rk)
void ftintrz_l_d(FPURegister fd, FPURegister fj)
void maskeqz(Register rd, Register rj, Register rk)
void EndBlockGrowBuffer()
void addi_w(Register rd, Register rj, int32_t si12)
void cto_w(Register rd, Register rj)
void and_(Register rd, Register rj, Register rk)
void rotr_w(Register rd, Register rj, Register rk)
static uint32_t GetRjField(Instr instr)
static bool IsNal(Instr instr)
void GenRegister(Opcode opcode, Register rj, Register rd, bool rjrd=true)
static uint32_t GetImmediate16(Instr instr)
void fmina_d(FPURegister fd, FPURegister fj, FPURegister fk)
void stptr_d(Register rd, Register rj, int32_t si14)
void AdjustBaseAndOffset(MemOperand *src)
void bitrev_8b(Register rd, Register rj)
static void JumpLabelToJumpRegister(Address pc)
void fadd_s(FPURegister fd, FPURegister fj, FPURegister fk)
void mulw_d_w(Register rd, Register rj, Register rk)
void stx_w(Register rd, Register rj, Register rk)
static void set_target_address_at(Address pc, Address constant_pool, Address target, WritableJitAllocation *jit_allocation, ICacheFlushMode icache_flush_mode=FLUSH_ICACHE_IF_NEEDED)
void amadd_d(Register rd, Register rk, Register rj)
void ftintrne_l_d(FPURegister fd, FPURegister fj)
void fmaxa_s(FPURegister fd, FPURegister fj, FPURegister fk)
static uint32_t GetSa3Field(Instr instr)
void slt(Register rd, Register rj, Register rk)
void pcaddu12i(Register rd, int32_t si20)
void ftint_w_d(FPURegister fd, FPURegister fj)
void GenRegister(Opcode opcode, Register rk, Register rj, Register rd)
int32_t branch_offset(Label *L)
void ldx_hu(Register rd, Register rj, Register rk)
int trampoline_pool_blocked_nesting_
void movcf2fr(FPURegister fd, CFRegister cj)
void amxor_d(Register rd, Register rk, Register rj)
void fadd_d(FPURegister fd, FPURegister fj, FPURegister fk)
static Register GetRjReg(Instr instr)
void mulh_du(Register rd, Register rj, Register rk)
void ldx_bu(Register rd, Register rj, Register rk)
void bceqz(CFRegister cj, int32_t si21)
void clz_w(Register rd, Register rj)
static bool IsAndImmediate(Instr instr)
void ClearCompactBranchState()
void ext_w_h(Register rd, Register rj)
void frecip_d(FPURegister fd, FPURegister fj)
void movgr2frh_w(FPURegister fd, Register rj)
void bceqz(CFRegister cj, Label *L)
void frsqrt_s(FPURegister fd, FPURegister fj)
Assembler(const AssemblerOptions &, std::unique_ptr< AssemblerBuffer >={})
void ftint_l_d(FPURegister fd, FPURegister fj)
void fstx_d(FPURegister fd, Register rj, Register rk)
void instr_at_put(int pos, Instr instr, WritableJitAllocation *jit_allocation=nullptr)
int64_t buffer_space() const
void slli_d(Register rd, Register rj, int32_t ui6)
void ftint_l_s(FPURegister fd, FPURegister fj)
void st_d(Register rd, Register rj, int32_t si12)
void ldx_h(Register rd, Register rj, Register rk)
void GenB(Opcode opcode, Register rj, int32_t si21)
bool block_buffer_growth_
void bnez(Register rj, int32_t offset)
static bool IsB(Instr instr)
void flogb_d(FPURegister fd, FPURegister fj)
void ldx_w(Register rd, Register rj, Register rk)
static bool IsBeq(Instr instr)
void CheckTrampolinePoolQuick(int extra_instructions=0)
int SizeOfCodeGeneratedSince(Label *label)
void mod_wu(Register rd, Register rj, Register rk)
void amor_d(Register rd, Register rk, Register rj)
void amadd_db_w(Register rd, Register rk, Register rj)
int32_t branch_offset21(Label *L)
void RecordDeoptReason(DeoptimizeReason reason, uint32_t node_id, SourcePosition position, int id)
void fmadd_s(FPURegister fd, FPURegister fj, FPURegister fk, FPURegister fa)
void BlockTrampolinePoolBefore(int pc_offset)
void srli_d(Register rd, Register rj, int32_t ui6)
void sll_d(Register rd, Register rj, Register rk)
static bool IsNop(Instr instr, unsigned int type)
void amor_db_w(Register rd, Register rk, Register rj)
void beq(Register rj, Register rd, int32_t offset)
void div_d(Register rd, Register rj, Register rk)
void sub_d(Register rd, Register rj, Register rk)
void alsl_wu(Register rd, Register rj, Register rk, int32_t sa2)
void amxor_db_d(Register rd, Register rk, Register rj)
void ftintrp_w_s(FPURegister fd, FPURegister fj)
void div_du(Register rd, Register rj, Register rk)
void srl_w(Register rd, Register rj, Register rk)
void pcaddi(Register rd, int32_t si20)
void fmsub_s(FPURegister fd, FPURegister fj, FPURegister fk, FPURegister fa)
static void set_target_compressed_address_at(Address pc, Address constant_pool, Tagged_t target, WritableJitAllocation *jit_allocation, ICacheFlushMode icache_flush_mode=FLUSH_ICACHE_IF_NEEDED)
static Builtin target_builtin_at(Address pc)
void ammax_du(Register rd, Register rk, Register rj)
EnsureSpace(Assembler *assembler)
V8_EXPORT_PRIVATE Address address() const
MemOperand(Register rj, Register offset=no_reg)
V8_INLINE Operand(Tagged< Smi > value)
RelocInfo::Mode rmode() const
V8_INLINE Operand(const ExternalReference &f)
union v8::internal::Operand::Value value_
Operand(Handle< HeapObject > handle)
V8_INLINE Operand(int64_t immediate, RelocInfo::Mode rmode=RelocInfo::NO_INFO)
HeapNumberRequest heap_number_request() const
bool IsHeapNumberRequest() const
V8_INLINE bool is_reg() const
bool is_heap_number_request_
static Operand EmbeddedNumber(double number)
int32_t immediate() const
V8_INLINE Operand(Register rm)
constexpr bool is_valid() const
UseScratchRegisterScope(Assembler *assembler)
bool hasAvailableFp() const
void ExcludeFp(const DoubleRegList &list)
DoubleRegister AcquireFp()
void Exclude(const RegList &list)
~UseScratchRegisterScope()
void Exclude(const Register ®1, const Register ®2=no_reg)
bool hasAvailable() const
DoubleRegList * availablefp_
void ExcludeFp(const DoubleRegister ®1, const DoubleRegister ®2=no_dreg)
DoubleRegList old_availablefp_
void Include(const Register ®1, const Register ®2=no_reg)
void IncludeFp(const DoubleRegList &list)
void IncludeFp(const DoubleRegister ®1, const DoubleRegister ®2=no_dreg)
void Include(const RegList &list)
const v8::base::TimeTicks end_
too high values may cause the compiler to set high thresholds for inlining to as much as possible avoid inlined allocation of objects that cannot escape trace load stores from virtual maglev objects use TurboFan fast string builder analyze liveness of environment slots and zap dead values trace TurboFan load elimination emit data about basic block usage in builtins to this enable builtin reordering when run mksnapshot flag for emit warnings when applying builtin profile data verify register allocation in TurboFan randomly schedule instructions to stress dependency tracking enable store store elimination in TurboFan rewrite far to near simulate GC compiler thread race related to allow float parameters to be passed in simulator mode JS Wasm Run additional turbo_optimize_inlined_js_wasm_wrappers enable experimental feedback collection in generic lowering enable Turboshaft s WasmLoadElimination enable Turboshaft s low level load elimination for JS enable Turboshaft s escape analysis for string concatenation use enable Turbolev features that we want to ship in the not too far future trace individual Turboshaft reduction steps trace intermediate Turboshaft reduction steps invocation count threshold for early optimization Enables optimizations which favor memory size over execution speed Enables sampling allocation profiler with X as a sample interval min size of a semi the new space consists of two semi spaces max size of the Collect garbage after Collect garbage after keeps maps alive for< n > old space garbage collections print one detailed trace line in allocation gc speed threshold for starting incremental marking via a task in percent of available threshold for starting incremental marking immediately in percent of available Use a single schedule for determining a marking schedule between JS and C objects schedules the minor GC task with kUserVisible priority max worker number of concurrent for NumberOfWorkerThreads start background threads that allocate memory concurrent_array_buffer_sweeping use parallel threads to clear weak refs in the atomic pause trace progress of the incremental marking trace object counts and memory usage * MB
constexpr Register no_reg
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
std::variant< Zone *, AccountingAllocator * > MaybeAssemblerZone
constexpr uint64_t kSmiShiftMask
constexpr uint8_t kInstrSize
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define V8_EXPORT_PRIVATE
HeapNumberRequest heap_number_request