40#ifndef V8_CODEGEN_PPC_ASSEMBLER_PPC_H_
41#define V8_CODEGEN_PPC_ASSEMBLER_PPC_H_
59class SafepointTableBuilder;
71 value_.immediate = immediate;
80 value_.immediate =
static_cast<intptr_t
>(value.ptr());
94 DCHECK(!IsHeapNumberRequest());
100 DCHECK(IsHeapNumberRequest());
101 return value_.heap_number_request;
109 rmode_ == RelocInfo::FULL_EMBEDDED_OBJECT ||
110 rmode_ == RelocInfo::CODE_TARGET);
111 return is_heap_number_request_;
121 bool is_heap_number_request_ =
false;
181 std::unique_ptr<AssemblerBuffer> = {});
184 std::unique_ptr<AssemblerBuffer> buffer = {})
194 int handler_table_offset);
311#if defined(V8_PPC_TAGGING_OPT)
324#define DECLARE_PPC_X_INSTRUCTIONS_A_FORM(name, instr_name, instr_value) \
325 inline void name(const Register rt, const Register ra, const Register rb, \
326 const RCBit rc = LeaveRC) { \
327 x_form(instr_name, rt, ra, rb, rc); \
330#define DECLARE_PPC_X_INSTRUCTIONS_B_FORM(name, instr_name, instr_value) \
331 inline void name(const Register ra, const Register rs, const Register rb, \
332 const RCBit rc = LeaveRC) { \
333 x_form(instr_name, rs, ra, rb, rc); \
336#define DECLARE_PPC_X_INSTRUCTIONS_C_FORM(name, instr_name, instr_value) \
337 inline void name(const Register dst, const Register src, \
338 const RCBit rc = LeaveRC) { \
339 x_form(instr_name, src, dst, r0, rc); \
342#define DECLARE_PPC_X_INSTRUCTIONS_D_FORM(name, instr_name, instr_value) \
344 inline void name(const R rt, const Register ra, const Register rb, \
345 const RCBit rc = LeaveRC) { \
346 x_form(instr_name, rt.code(), ra.code(), rb.code(), rc); \
349 inline void name(const R dst, const MemOperand& src) { \
350 name(dst, src.ra(), src.rb()); \
353#define DECLARE_PPC_X_INSTRUCTIONS_E_FORM(name, instr_name, instr_value) \
354 inline void name(const Register dst, const Register src, const int sh, \
355 const RCBit rc = LeaveRC) { \
356 x_form(instr_name, src.code(), dst.code(), sh, rc); \
359#define DECLARE_PPC_X_INSTRUCTIONS_F_FORM(name, instr_name, instr_value) \
360 inline void name(const Register src1, const Register src2, \
361 const CRegister cr = cr0, const RCBit rc = LeaveRC) { \
362 x_form(instr_name, cr, src1, src2, rc); \
364 inline void name##w(const Register src1, const Register src2, \
365 const CRegister cr = cr0, const RCBit rc = LeaveRC) { \
366 x_form(instr_name, cr.code() * B2, src1.code(), src2.code(), LeaveRC); \
369#define DECLARE_PPC_X_INSTRUCTIONS_G_FORM(name, instr_name, instr_value) \
370 inline void name(const Register dst, const Register src) { \
371 x_form(instr_name, src, dst, r0, LeaveRC); \
374#define DECLARE_PPC_X_INSTRUCTIONS_EH_S_FORM(name, instr_name, instr_value) \
375 inline void name(const Register dst, const MemOperand& src) { \
376 x_form(instr_name, src.ra(), dst, src.rb(), SetEH); \
378#define DECLARE_PPC_X_INSTRUCTIONS_EH_L_FORM(name, instr_name, instr_value) \
379 inline void name(const Register dst, const MemOperand& src) { \
380 x_form(instr_name, src.ra(), dst, src.rb(), SetEH); \
412 nor(dst, src, src,
rc);
424#undef DECLARE_PPC_X_INSTRUCTIONS_A_FORM
425#undef DECLARE_PPC_X_INSTRUCTIONS_B_FORM
426#undef DECLARE_PPC_X_INSTRUCTIONS_C_FORM
427#undef DECLARE_PPC_X_INSTRUCTIONS_D_FORM
428#undef DECLARE_PPC_X_INSTRUCTIONS_E_FORM
429#undef DECLARE_PPC_X_INSTRUCTIONS_F_FORM
430#undef DECLARE_PPC_X_INSTRUCTIONS_G_FORM
431#undef DECLARE_PPC_X_INSTRUCTIONS_EH_S_FORM
432#undef DECLARE_PPC_X_INSTRUCTIONS_EH_L_FORM
434#define DECLARE_PPC_XX2_VECTOR_INSTRUCTIONS(name, instr_name, instr_value) \
435 inline void name(const Simd128Register rt, const Simd128Register rb) { \
436 xx2_form(instr_name, rt, rb); \
438#define DECLARE_PPC_XX2_SCALAR_INSTRUCTIONS(name, instr_name, instr_value) \
439 inline void name(const DoubleRegister rt, const DoubleRegister rb) { \
440 xx2_form(instr_name, rt, rb); \
443 template <
typename T>
445 static_assert(std::is_same<T, Simd128Register>::value ||
446 std::is_same<T, DoubleRegister>::value,
447 "VSX only uses FP or Vector registers.");
451 if (std::is_same<T, Simd128Register>::value) {
462#undef DECLARE_PPC_XX2_VECTOR_INSTRUCTIONS
463#undef DECLARE_PPC_XX2_SCALAR_INSTRUCTIONS
465#define DECLARE_PPC_XX3_VECTOR_INSTRUCTIONS_A_FORM(name, instr_name, \
467 inline void name(const Simd128Register rt, const Simd128Register ra, \
468 const Simd128Register rb, const RCBit rc = LeaveRC) { \
469 xx3_form(instr_name, rt, ra, rb, rc); \
471#define DECLARE_PPC_XX3_VECTOR_INSTRUCTIONS_B_FORM(name, instr_name, \
473 inline void name(const Simd128Register rt, const Simd128Register ra, \
474 const Simd128Register rb) { \
475 xx3_form(instr_name, rt, ra, rb); \
477#define DECLARE_PPC_XX3_SCALAR_INSTRUCTIONS(name, instr_name, instr_value) \
478 inline void name(const DoubleRegister rt, const DoubleRegister ra, \
479 const DoubleRegister rb) { \
480 xx3_form(instr_name, rt, ra, rb); \
486 int AX = 1,
BX = 1, TX = 1;
492 template <
typename T>
494 static_assert(std::is_same<T, Simd128Register>::value ||
495 std::is_same<T, DoubleRegister>::value,
496 "VSX only uses FP or Vector registers.");
498 int AX = 0,
BX = 0, TX = 0;
500 if (std::is_same<T, Simd128Register>::value) {
505 (
b.code() & 0x1F) *
B11 | AX *
B2 |
BX *
B1 | TX);
511#undef DECLARE_PPC_XX3_VECTOR_INSTRUCTIONS_A_FORM
512#undef DECLARE_PPC_XX3_VECTOR_INSTRUCTIONS_B_FORM
513#undef DECLARE_PPC_XX3_SCALAR_INSTRUCTIONS
515#define DECLARE_PPC_VX_INSTRUCTIONS_A_FORM(name, instr_name, instr_value) \
516 inline void name(const Simd128Register rt, const Simd128Register rb, \
517 const Operand& imm) { \
518 vx_form(instr_name, rt, rb, imm); \
520#define DECLARE_PPC_VX_INSTRUCTIONS_B_FORM(name, instr_name, instr_value) \
521 inline void name(const Simd128Register rt, const Simd128Register ra, \
522 const Simd128Register rb) { \
523 vx_form(instr_name, rt, ra, rb); \
525#define DECLARE_PPC_VX_INSTRUCTIONS_C_FORM(name, instr_name, instr_value) \
526 inline void name(const Simd128Register rt, const Simd128Register rb) { \
527 vx_form(instr_name, rt, rb); \
529#define DECLARE_PPC_VX_INSTRUCTIONS_E_FORM(name, instr_name, instr_value) \
530 inline void name(const Simd128Register rt, const Operand& imm) { \
531 vx_form(instr_name, rt, imm); \
533#define DECLARE_PPC_VX_INSTRUCTIONS_F_FORM(name, instr_name, instr_value) \
534 inline void name(const Register rt, const Simd128Register rb) { \
535 vx_form(instr_name, rt, rb); \
537#define DECLARE_PPC_VX_INSTRUCTIONS_G_FORM(name, instr_name, instr_value) \
538 inline void name(const Simd128Register rt, const Register rb, \
539 const Operand& imm) { \
540 vx_form(instr_name, rt, rb, imm); \
577#undef DECLARE_PPC_VX_INSTRUCTIONS_A_FORM
578#undef DECLARE_PPC_VX_INSTRUCTIONS_B_FORM
579#undef DECLARE_PPC_VX_INSTRUCTIONS_C_FORM
580#undef DECLARE_PPC_VX_INSTRUCTIONS_E_FORM
581#undef DECLARE_PPC_VX_INSTRUCTIONS_F_FORM
582#undef DECLARE_PPC_VX_INSTRUCTIONS_G_FORM
584#define DECLARE_PPC_VA_INSTRUCTIONS_A_FORM(name, instr_name, instr_value) \
585 inline void name(const Simd128Register rt, const Simd128Register ra, \
586 const Simd128Register rb, const Simd128Register rc) { \
587 va_form(instr_name, rt, ra, rb, rc); \
597#undef DECLARE_PPC_VA_INSTRUCTIONS_A_FORM
599#define DECLARE_PPC_VC_INSTRUCTIONS(name, instr_name, instr_value) \
600 inline void name(const Simd128Register rt, const Simd128Register ra, \
601 const Simd128Register rb, const RCBit rc = LeaveRC) { \
602 vc_form(instr_name, rt, ra, rb, rc); \
612#undef DECLARE_PPC_VC_INSTRUCTIONS
614#define DECLARE_PPC_PREFIX_INSTRUCTIONS_TYPE_00(name, instr_name, instr_value) \
615 inline void name(const Operand& imm, const PRBit pr = LeavePR) { \
616 prefix_form(instr_name, imm, pr); \
618#define DECLARE_PPC_PREFIX_INSTRUCTIONS_TYPE_10(name, instr_name, instr_value) \
619 inline void name(const Operand& imm, const PRBit pr = LeavePR) { \
620 prefix_form(instr_name, imm, pr); \
627#undef DECLARE_PPC_PREFIX_INSTRUCTIONS_TYPE_00
628#undef DECLARE_PPC_PREFIX_INSTRUCTIONS_TYPE_10
671 int cmpi_ra = (
instr_at(cmpi_pos) & 0x1f0000) >> 16;
673 int ra = (xinstr & 0x1f0000) >> 16;
675 if ((xinstr & sradi_mask) == (
EXT2 | SRADIX)) {
679 }
else if ((xinstr & srawi_mask) == (
EXT2 | SRAWIX)) {
697 DCHECK(cr.code() >= 0 && cr.code() <= 7);
741 DCHECK(cr.code() >= 0 && cr.code() <= 7);
785 DCHECK(cr.code() >= 0 && cr.code() <= 7);
831 if ((
L->is_bound() &&
is_near(
L, cond))) {
868 b(overflow,
L, cr, lk);
1208 assem_->StartBlockTrampolinePool();
1223 assem_->StartBlockConstantPoolEntrySharing();
1226 assem_->EndBlockConstantPoolEntrySharing();
1297 bool canOptimize)
const;
1335 (!
options().record_reloc_info_for_serialization &&
1380 static constexpr int kGap = 32;
1501 return trampoline_slot;
1552 old_available_(*assembler->GetScratchRegisterList()) {}
1555 *
assembler_->GetScratchRegisterList() = old_available_;
1559 return assembler_->GetScratchRegisterList()->PopFirst();
1564 return !
assembler_->GetScratchRegisterList()->is_empty();
#define DECLARE_PPC_XX2_VECTOR_INSTRUCTIONS(name, instr_name, instr_value)
#define DECLARE_PPC_VX_INSTRUCTIONS_E_FORM(name, instr_name, instr_value)
#define DECLARE_PPC_VX_INSTRUCTIONS_B_FORM(name, instr_name, instr_value)
#define DECLARE_PPC_XX3_VECTOR_INSTRUCTIONS_A_FORM(name, instr_name, instr_value)
#define DECLARE_PPC_X_INSTRUCTIONS_EH_L_FORM(name, instr_name, instr_value)
#define DECLARE_PPC_X_INSTRUCTIONS_C_FORM(name, instr_name, instr_value)
#define DECLARE_PPC_VX_INSTRUCTIONS_G_FORM(name, instr_name, instr_value)
#define DECLARE_PPC_X_INSTRUCTIONS_A_FORM(name, instr_name, instr_value)
#define DECLARE_PPC_VC_INSTRUCTIONS(name, instr_name, instr_value)
#define DECLARE_PPC_X_INSTRUCTIONS_F_FORM(name, instr_name, instr_value)
#define DECLARE_PPC_XX3_VECTOR_INSTRUCTIONS_B_FORM(name, instr_name, instr_value)
#define DECLARE_PPC_XX2_SCALAR_INSTRUCTIONS(name, instr_name, instr_value)
#define DECLARE_PPC_VA_INSTRUCTIONS_A_FORM(name, instr_name, instr_value)
#define DECLARE_PPC_XX3_SCALAR_INSTRUCTIONS(name, instr_name, instr_value)
#define DECLARE_PPC_VX_INSTRUCTIONS_A_FORM(name, instr_name, instr_value)
#define DECLARE_PPC_X_INSTRUCTIONS_EH_S_FORM(name, instr_name, instr_value)
#define DECLARE_PPC_X_INSTRUCTIONS_B_FORM(name, instr_name, instr_value)
#define DECLARE_PPC_VX_INSTRUCTIONS_F_FORM(name, instr_name, instr_value)
#define DECLARE_PPC_X_INSTRUCTIONS_E_FORM(name, instr_name, instr_value)
#define DECLARE_PPC_PREFIX_INSTRUCTIONS_TYPE_10(name, instr_name, instr_value)
#define DECLARE_PPC_PREFIX_INSTRUCTIONS_TYPE_00(name, instr_name, instr_value)
#define DECLARE_PPC_VX_INSTRUCTIONS_C_FORM(name, instr_name, instr_value)
#define DECLARE_PPC_X_INSTRUCTIONS_G_FORM(name, instr_name, instr_value)
#define DECLARE_PPC_X_INSTRUCTIONS_D_FORM(name, instr_name, instr_value)
static constexpr int kMinimalBufferSize
const AssemblerOptions & options() const
BlockConstantPoolEntrySharingScope(Assembler *assem)
DISALLOW_IMPLICIT_CONSTRUCTORS(BlockConstantPoolEntrySharingScope)
~BlockConstantPoolEntrySharingScope()
DISALLOW_IMPLICIT_CONSTRUCTORS(BlockTrampolinePoolScope)
BlockTrampolinePoolScope(Assembler *assem)
~BlockTrampolinePoolScope()
Trampoline(int start, int slot_count)
void bind_to(Label *L, int pos)
void pstd(Register src, const MemOperand &dst)
void rotldi(Register ra, Register rs, int sh, RCBit r=LeaveRC)
static bool IsRldicl(Instr instr)
static const int kMaximalBufferSize
void xx2_form(Instr instr, T t, T b)
void mulhd(Register dst, Register src1, Register src2, RCBit r=LeaveRC)
void b(int branch_offset, LKBit lk)
Label * ConstantPoolPosition()
void ld(Register rd, const MemOperand &rs)
static constexpr int kTaggedLoadInstructions
void GetCode(LocalIsolate *isolate, CodeDesc *desc)
RelocInfoWriter reloc_info_writer
void andis(Register ra, Register rs, const Operand &imm)
void stb(Register dst, const MemOperand &src)
void mtvsrdd(const Simd128Register rt, const Register ra, const Register rb)
void andi(Register ra, Register rs, const Operand &imm)
void divwu(Register dst, Register src1, Register src2, OEBit o=LeaveOE, RCBit r=LeaveRC)
void rotlw(Register ra, Register rs, Register rb, RCBit r=LeaveRC)
void CheckTrampolinePoolQuick(int extra_space=0)
bool is_near(Label *L, OffsetSize bits)
static constexpr int kSpecialTargetSize
void addi(Register dst, Register src, const Operand &imm)
void patch_pc_address(Register dst, int pc_offset, int return_address_offset)
void rldicr(Register dst, Register src, int sh, int me, RCBit r=LeaveRC)
void divw(Register dst, Register src1, Register src2, OEBit o=LeaveOE, RCBit r=LeaveRC)
void addze(Register dst, Register src1, OEBit o=LeaveOE, RCBit r=LeaveRC)
void lxsiwzx(const Simd128Register rt, const MemOperand &src)
void mtfsb0(FPSCRBit bit, RCBit rc=LeaveRC)
void lfsu(const DoubleRegister frt, const MemOperand &src)
void CheckTrampolinePool()
void notx(Register dst, Register src, RCBit rc=LeaveRC)
int instructions_required_for_mov(Register dst, const Operand &src) const
static V8_INLINE Address target_constant_pool_address_at(Address pc, Address constant_pool, ConstantPoolEntry::Access access, ConstantPoolEntry::Type type)
void bit(const VRegister &vd, const VRegister &vn, const VRegister &vm)
void x_form(Instr instr, CRegister cr, Register s1, Register s2, RCBit rc)
void stfsu(const DoubleRegister frs, const MemOperand &src)
void icbi(Register ra, Register rb)
bool is_trampoline_emitted() const
static bool IsCmpRegister(Instr instr)
bool is_near(Label *L, Condition cond)
void lis(Register dst, const Operand &imm)
void fctidu(const DoubleRegister frt, const DoubleRegister frb, RCBit rc=LeaveRC)
void mds_form(Instr instr, Register ra, Register rs, Register rb, int maskbit, RCBit r)
void stxsiwx(const Simd128Register rs, const MemOperand &dst)
void EndBlockTrampolinePool()
static int GetCmpImmediateRawImmediate(Instr instr)
void lxvx(const Simd128Register rt, const MemOperand &src)
void mov_label_offset(Register dst, Label *label)
void fmul(const DoubleRegister frt, const DoubleRegister fra, const DoubleRegister frc, RCBit rc=LeaveRC)
static constexpr int kTrampolineSlotsSize
void fcpsgn(const DoubleRegister frt, const DoubleRegister fra, const DoubleRegister frc, RCBit rc=LeaveRC)
int next_trampoline_check_
void xx3_form(Instr instr, T t, T a, T b)
void frip(const DoubleRegister frt, const DoubleRegister frb, RCBit rc=LeaveRC)
void xxspltib(const Simd128Register rt, const Operand &imm)
V8_INLINE void PatchConstantPoolAccessInstruction(int pc_offset, int offset, ConstantPoolEntry::Access access, ConstantPoolEntry::Type type)
void stdu(Register rs, const MemOperand &src)
void mr(Register dst, Register src)
void plfd(DoubleRegister dst, const MemOperand &src)
static bool IsAddic(Instr instr)
static constexpr int kNoHandlerTable
void extsw(Register rs, Register ra, RCBit rc=LeaveRC)
void lxsdx(const Simd128Register rt, const MemOperand &src)
void b(int branch_offset, Condition cond=al, RelocInfo::Mode rmode=RelocInfo::NO_INFO)
Assembler(const MaybeAssemblerZone &, const AssemblerOptions &options, std::unique_ptr< AssemblerBuffer > buffer={})
int branch_offset(Label *L)
void mulhw(Register dst, Register src1, Register src2, RCBit r=LeaveRC)
static int deserialization_special_target_size(Address instruction_payload)
void StartBlockConstantPoolEntrySharing()
void fdiv(const DoubleRegister frt, const DoubleRegister fra, const DoubleRegister frb, RCBit rc=LeaveRC)
void AllocateAndInstallRequestedHeapNumbers(LocalIsolate *isolate)
static V8_INLINE int GetConstantPoolOffset(Address pc, ConstantPoolEntry::Access access, ConstantPoolEntry::Type type)
void rldicl(Register dst, Register src, int sh, int mb, RCBit r=LeaveRC)
void sradi(Register ra, Register rs, int sh, RCBit r=LeaveRC)
void emit_label_addr(Label *label)
std::vector< DeferredRelocInfo > relocations_
void stop(Condition cond=al, int32_t code=kDefaultStopCode, CRegister cr=cr0)
bool internal_trampoline_exception_
void fctid(const DoubleRegister frt, const DoubleRegister frb, RCBit rc=LeaveRC)
void frin(const DoubleRegister frt, const DoubleRegister frb, RCBit rc=LeaveRC)
void fctiduz(const DoubleRegister frt, const DoubleRegister frb, RCBit rc=LeaveRC)
int32_t get_trampoline_entry()
static constexpr int kMaxCondBranchReach
void subc(Register dst, Register src1, Register src2, OEBit s=LeaveOE, RCBit r=LeaveRC)
static bool IsCmpImmediate(Instr instr)
static void deserialization_set_target_internal_reference_at(Address pc, Address target, WritableJitAllocation &jit_allocation, RelocInfo::Mode mode=RelocInfo::INTERNAL_REFERENCE)
friend class BlockTrampolinePoolScope
void c(FPUCondition cond, SecondaryField fmt, FPURegister ft, FPURegister fs, uint16_t cc=0)
void bc(int branch_offset, BOfield bo, int condition_bit, LKBit lk=LeaveLK)
bool is_trampoline_pool_blocked() const
void ld(Register rd, const MemOperand &src)
void std(Register rs, const MemOperand &src)
void StartBlockTrampolinePool()
void md_form(Instr instr, Register ra, Register rs, int shift, int maskbit, RCBit r)
void plha(Register dst, const MemOperand &src)
void fmsub(const DoubleRegister frt, const DoubleRegister fra, const DoubleRegister frc, const DoubleRegister frb, RCBit rc=LeaveRC)
bool use_constant_pool_for_mov(Register dst, const Operand &src, bool canOptimize) const
bool is_constant_pool_entry_sharing_blocked() const
void isel(Register rt, Register ra, Register rb, int cb)
void stxsdx(const Simd128Register rs, const MemOperand &dst)
void srdi(Register dst, Register src, const Operand &val, RCBit rc=LeaveRC)
static bool IsNop(Instr instr, int type=NON_MARKING_NOP)
int InstructionsGeneratedSince(Label *label)
void vx_form(Instr instr, Simd128Register rt, Simd128Register ra, Simd128Register rb)
void clrlwi(Register dst, Register src, const Operand &val, RCBit rc=LeaveRC)
void stxvx(const Simd128Register rt, const MemOperand &dst)
void mtfprwz(DoubleRegister dst, Register src)
bool has_exception() const
static bool IsOri(Instr instr)
void frsp(const DoubleRegister frt, const DoubleRegister frb, RCBit rc=LeaveRC)
void lhz(Register dst, const MemOperand &src)
void instr_at_put(int pos, Instr instr)
int optimizable_cmpi_pos_
void ble(Label *L, CRegister cr=cr0, LKBit lk=LeaveLK)
void clrldi(Register dst, Register src, const Operand &val, RCBit rc=LeaveRC)
void rotld(Register ra, Register rs, Register rb, RCBit r=LeaveRC)
void sub(Register dst, Register src1, Register src2, OEBit s=LeaveOE, RCBit r=LeaveRC)
void rlwnm(Register ra, Register rs, Register rb, int mb, int me, RCBit rc=LeaveRC)
void b(Condition cond, Label *L, CRegister cr=cr0, LKBit lk=LeaveLK)
static constexpr SafepointTableBuilderBase * kNoSafepointTable
void bitwise_add32(Register dst, Register src, int32_t value)
static bool IsCrSet(Instr instr)
void blt(Label *L, CRegister cr=cr0, LKBit lk=LeaveLK)
Simd128Register Simd128Register ra
void xori(Register dst, Register src, const Operand &imm)
static bool IsAndi(Instr instr)
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 pli(Register dst, const Operand &imm)
void mulhdu(Register dst, Register src1, Register src2, RCBit r=LeaveRC)
void ori(Register dst, Register src, const Operand &imm)
@ PROPERTY_ACCESS_INLINED
@ PROPERTY_ACCESS_INLINED_CONTEXT
@ PROPERTY_ACCESS_INLINED_CONTEXT_DONT_DELETE
void fsub(const DoubleRegister frt, const DoubleRegister fra, const DoubleRegister frb, RCBit rc=LeaveRC)
ConstantPoolEntry::Access ConstantPoolAddEntry(base::Double value)
void rldimi(Register dst, Register src, int sh, int mb, RCBit r=LeaveRC)
void d_form(Instr instr, Register rt, Register ra, const intptr_t val, bool signed_disp)
Simd128Register Simd128Register Simd128Register Simd128Register rc
void creqv(int bt, int ba, int bb)
void crxor(int bt, int ba, int bb)
void mul(Register dst, Register src1, Register src2, OEBit s=LeaveOE, RCBit r=LeaveRC)
void addis(Register dst, Register src, const Operand &imm)
static constexpr int kMaxRelocSize
void RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data=0)
void srwi(Register dst, Register src, const Operand &val, RCBit rc=LeaveRC)
void fneg(const DoubleRegister frt, const DoubleRegister frb, RCBit rc=LeaveRC)
void add(Register dst, Register src1, Register src2, OEBit s=LeaveOE, RCBit r=LeaveRC)
void lwax(Register rt, const MemOperand &src)
void addic(Register dst, Register src, const Operand &imm)
static uint32_t uint32_constant_at(Address pc, Address constant_pool)
static V8_INLINE bool IsConstantPoolLoadStart(Address pc, ConstantPoolEntry::Access *access=nullptr)
void lwa(Register dst, const MemOperand &src)
void x_form(Instr instr, Register ra, Register rs, Register rb, EHBit eh=SetEH)
static V8_INLINE void set_target_address_at(Address pc, Address constant_pool, Address target, WritableJitAllocation *jit_allocation, ICacheFlushMode icache_flush_mode=FLUSH_ICACHE_IF_NEEDED)
void x_form(Instr instr, Register rs, Register ra, Register rb, RCBit rc)
RegList * GetScratchRegisterList()
void mov(Register dst, const Operand &src)
void xo_form(Instr instr, Register rt, Register ra, Register rb, OEBit o, RCBit r)
void lxvd(const Simd128Register rt, const MemOperand &src)
void mulld(Register dst, Register src1, Register src2, OEBit o=LeaveOE, RCBit r=LeaveRC)
void nor(Register rd, Register rj, Register rk)
static Tagged_t target_compressed_address_at(Address pc, Address constant_pool)
void cmpwi(Register src1, const Operand &src2, CRegister cr=cr0)
static bool IsLis(Instr instr)
void mffprd(Register dst, DoubleRegister src)
static constexpr int kMaxBlockTrampolineSectionSize
void shift(Operand dst, Immediate shift_amount, int subcode, int size)
void fcfidu(const DoubleRegister frt, const DoubleRegister frb, RCBit rc=LeaveRC)
Handle< Object > code_target_object_handle_at(Address pc, Address constant_pool)
void sldi(Register dst, Register src, const Operand &val, RCBit rc=LeaveRC)
void rldic(Register dst, Register src, int sh, int mb, RCBit r=LeaveRC)
void plwa(Register dst, const MemOperand &src)
void mtfprwa(DoubleRegister dst, Register src)
static bool Is64BitLoadIntoR12(Instr instr1, Instr instr2, Instr instr3, Instr instr4, Instr instr5)
void a_form(Instr instr, DoubleRegister frt, DoubleRegister fra, DoubleRegister frb, RCBit r)
void rotrwi(Register ra, Register rs, int sh, RCBit r=LeaveRC)
void vx_form(Instr instr, Simd128Register rt, Simd128Register rb, const Operand &imm)
void bne(Label *L, CRegister cr=cr0, LKBit lk=LeaveLK)
void lfd(const DoubleRegister frt, const MemOperand &src)
void rlwimi(Register ra, Register rs, int sh, int mb, int me, RCBit rc=LeaveRC)
static constexpr int kGap
int constant_pool_entry_sharing_blocked_nesting_
void mcrfs(CRegister cr, FPSCRBit bit)
void fcmpu(const DoubleRegister fra, const DoubleRegister frb, CRegister cr=cr0)
void stxsibx(const Simd128Register rs, const MemOperand &dst)
static bool IsBranch(Instr instr)
void fctiwz(const DoubleRegister frt, const DoubleRegister frb)
void fctiwuz(const DoubleRegister frt, const DoubleRegister frb)
void dcbf(Register ra, Register rb)
void pstb(Register src, const MemOperand &dst)
void stfd(const DoubleRegister frs, const MemOperand &src)
void cmpi(Register src1, const Operand &src2, CRegister cr=cr0)
void mtfsf(const DoubleRegister frb, bool L=1, int FLM=0, bool W=0, RCBit rc=LeaveRC)
static void instr_at_put(Address pc, Instr instr)
void BlockTrampolinePoolFor(int instructions)
void EnsureSpaceFor(int space_needed)
void cmpli(Register src1, const Operand &src2, CRegister cr=cr0)
void lwz(Register dst, const MemOperand &src)
static Register GetCmpImmediateRegister(Instr instr)
void friz(const DoubleRegister frt, const DoubleRegister frb, RCBit rc=LeaveRC)
void GetCode(Isolate *isolate, CodeDesc *desc)
static constexpr int kMovInstructionsNoConstantPool
void lwzu(Register dst, const MemOperand &src)
void add_label_offset(Register dst, Register base, Label *label, int delta=0)
void b(Label *L, LKBit lk=LeaveLK)
void addc(Register dst, Register src1, Register src2, OEBit o=LeaveOE, RCBit r=LeaveRC)
void lha(Register dst, const MemOperand &src)
Simd128Register Simd128Register Simd128Register rb
void lfs(const DoubleRegister frt, const MemOperand &src)
void mfvsrd(const Register ra, const Simd128Register r)
void vx_form(Instr instr, Simd128Register rt, Register rb, const Operand &imm)
void psth(Register src, const MemOperand &dst)
Handle< HeapObject > compressed_embedded_object_handle_at(Address pc, Address constant_pool)
void fctidz(const DoubleRegister frt, const DoubleRegister frb, RCBit rc=LeaveRC)
void fcfid(const DoubleRegister frt, const DoubleRegister frb, RCBit rc=LeaveRC)
void xoris(Register ra, Register rs, const Operand &imm)
void MaybeEmitOutOfLineConstantPool()
int no_trampoline_pool_before_
void target_at_put(int pos, int target_pos, bool *is_branch=nullptr)
void mffs(const DoubleRegister frt, RCBit rc=LeaveRC)
static constexpr int kInvalidSlotPos
void rldcl(Register ra, Register rs, Register rb, int mb, RCBit r=LeaveRC)
void cmplwi(Register src1, const Operand &src2, CRegister cr=cr0)
void beq(Label *L, CRegister cr=cr0, LKBit lk=LeaveLK)
void plfs(DoubleRegister dst, const MemOperand &src)
static bool IsRlwinm(Instr instr)
void fcfids(const DoubleRegister frt, const DoubleRegister frb, RCBit rc=LeaveRC)
ConstantPoolEntry::Access ConstantPoolAddEntry(RelocInfo::Mode rmode, intptr_t value)
void clrrwi(Register dst, Register src, const Operand &val, RCBit rc=LeaveRC)
void fabs(const DoubleRegister frt, const DoubleRegister frb, RCBit rc=LeaveRC)
static V8_INLINE Address target_address_at(Address pc, Address constant_pool)
void fsel(const DoubleRegister frt, const DoubleRegister fra, const DoubleRegister frc, const DoubleRegister frb, RCBit rc=LeaveRC)
static Instr instr_at(Address pc)
static int encode_crbit(const CRegister &cr, enum CRBit crbit)
void mov_label_addr(Register dst, Label *label)
void mtvsrd(const Simd128Register rt, const Register ra)
void subfic(Register dst, Register src, const Operand &imm)
static V8_INLINE bool IsConstantPoolLoadEnd(Address pc, ConstantPoolEntry::Access *access=nullptr)
static constexpr int kMovInstructionsConstantPool
void divd(Register dst, Register src1, Register src2, OEBit o=LeaveOE, RCBit r=LeaveRC)
void frim(const DoubleRegister frt, const DoubleRegister frb, RCBit rc=LeaveRC)
void plbz(Register dst, const MemOperand &src)
void mtfprd(DoubleRegister dst, Register src)
void EndBlockConstantPoolEntrySharing()
void oris(Register dst, Register src, const Operand &imm)
void bclr(Condition cond, CRegister cr=cr0, LKBit lk=LeaveLK)
void stwu(Register dst, const MemOperand &src)
void bunordered(Label *L, CRegister cr=cr0, LKBit lk=LeaveLK)
void fadd(const DoubleRegister frt, const DoubleRegister fra, const DoubleRegister frb, RCBit rc=LeaveRC)
void rlwinm(Register ra, Register rs, int sh, int mb, int me, RCBit rc=LeaveRC)
void bcctr(BOfield bo, int condition_bit, LKBit lk)
void plhz(Register dst, const MemOperand &src)
void pstfd(const DoubleRegister src, const MemOperand &dst)
void bc_short(Condition cond, Label *L, CRegister cr=cr0, LKBit lk=LeaveLK)
void pstw(Register src, const MemOperand &dst)
void fmr(const DoubleRegister frt, const DoubleRegister frb, RCBit rc=LeaveRC)
void xx3_form(Instr instr, Simd128Register t, Simd128Register a, Simd128Register b, int rc)
void mulli(Register dst, Register src, const Operand &imm)
void fmadd(const DoubleRegister frt, const DoubleRegister fra, const DoubleRegister frc, const DoubleRegister frb, RCBit rc=LeaveRC)
void GetCode(LocalIsolate *isolate, CodeDesc *desc, SafepointTableBuilderBase *safepoint_table_builder, int handler_table_offset)
void stxsihx(const Simd128Register rs, const MemOperand &dst)
void ldu(Register rd, const MemOperand &src)
void bordered(Label *L, CRegister cr=cr0, LKBit lk=LeaveLK)
void isel(Condition cond, Register rt, Register ra, Register rb, CRegister cr=cr0)
void pstfs(const DoubleRegister src, const MemOperand &dst)
static Register GetRB(Instr instr)
void bt(Operand dst, Register src)
void stxvd(const Simd128Register rt, const MemOperand &dst)
void vc_form(Instr instr, Simd128Register rt, Simd128Register ra, Simd128Register rb, int rc)
static Register GetRA(Instr instr)
void bitwise_mov32(Register dst, int32_t value)
void li(Register dst, const Operand &src)
static bool IsLi(Instr instr)
void mulhwu(Register dst, Register src1, Register src2, RCBit r=LeaveRC)
void mffprwz(Register dst, DoubleRegister src)
void plwz(Register dst, const MemOperand &src)
static Condition GetCondition(Instr instr)
void lbz(Register dst, const MemOperand &src)
void bclr(BOfield bo, int condition_bit, LKBit lk)
void sube(Register dst, Register src1, Register src2, OEBit s=LeaveOE, RCBit r=LeaveRC)
void bitwise_mov(Register dst, intptr_t value)
void emit_prefix(Instr x)
int trampoline_pool_blocked_nesting_
void bkpt(uint32_t imm16)
void vx_form(Instr instr, Simd128Register rt, const Operand &imm)
void mtcrf(Register src, uint8_t FXM)
void divdu(Register dst, Register src1, Register src2, OEBit o=LeaveOE, RCBit r=LeaveRC)
void prefix_form(Instr instr, const Operand &imm, int pr)
CRegister cmpi_optimization(CRegister cr)
void rotlwi(Register ra, Register rs, int sh, RCBit r=LeaveRC)
void stfs(const DoubleRegister frs, const MemOperand &src)
void stw(Register dst, const MemOperand &src)
void psubi(Register dst, Register src, const Operand &imm)
Assembler(const AssemblerOptions &, std::unique_ptr< AssemblerBuffer >={})
void bnooverflow(Label *L, CRegister cr=cr0, LKBit lk=LeaveLK)
void sh(Register rd, const MemOperand &rs)
void lfdu(const DoubleRegister frt, const MemOperand &src)
void clrrdi(Register dst, Register src, const Operand &val, RCBit rc=LeaveRC)
void subi(Register dst, Register src1, const Operand &src2)
void sth(Register dst, const MemOperand &src)
void fcfidus(const DoubleRegister frt, const DoubleRegister frb, RCBit rc=LeaveRC)
void bgt(Label *L, CRegister cr=cr0, LKBit lk=LeaveLK)
void mullw(Register dst, Register src1, Register src2, OEBit o=LeaveOE, RCBit r=LeaveRC)
void stfdu(const DoubleRegister frs, const MemOperand &src)
void lxsihzx(const Simd128Register rt, const MemOperand &src)
void boverflow(Label *L, CRegister cr=cr0, LKBit lk=LeaveLK)
void mtfsfi(int bf, int immediate, RCBit rc=LeaveRC)
bool ConstantPoolAccessIsInOverflow() const
void neg(Register rt, Register ra, OEBit o=LeaveOE, RCBit c=LeaveRC)
void fsqrt(const DoubleRegister frt, const DoubleRegister frb, RCBit rc=LeaveRC)
void CheckTrampolinePoolQuick(int extra_instructions=0)
int SizeOfCodeGeneratedSince(Label *label)
RegList scratch_register_list_
static constexpr int kMovInstructions
void mtfsb1(FPSCRBit bit, RCBit rc=LeaveRC)
int tracked_branch_count_
void fctiw(const DoubleRegister frt, const DoubleRegister frb)
void RecordDeoptReason(DeoptimizeReason reason, uint32_t node_id, SourcePosition position, int id)
void lxsibzx(const Simd128Register rt, const MemOperand &src)
void BlockTrampolinePoolBefore(int pc_offset)
void paddi(Register dst, Register src, const Operand &imm)
void bge(Label *L, CRegister cr=cr0, LKBit lk=LeaveLK)
void pld(Register dst, const MemOperand &src)
void vx_form(Instr instr, Register rt, Simd128Register rb)
void bdnz(Label *L, LKBit lk=LeaveLK)
void vx_form(Instr instr, Simd128Register rt, Simd128Register rb)
void x_form(Instr instr, int f1, int f2, int f3, int rc)
void adde(Register dst, Register src1, Register src2, OEBit o=LeaveOE, RCBit r=LeaveRC)
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)
ConstantPoolBuilder constant_pool_builder_
void rotrdi(Register ra, Register rs, int sh, RCBit r=LeaveRC)
int max_reach_from(int pos)
void slwi(Register dst, Register src, const Operand &val, RCBit rc=LeaveRC)
void mfvsrwz(const Register ra, const Simd128Register r)
void GrowBuffer(int needed=0)
RelocInfo::Mode rmode() const
DeferredRelocInfo(int position, RelocInfo::Mode rmode, intptr_t data)
EnsureSpace(Assembler *assembler)
V8_EXPORT_PRIVATE Address address() const
MemOperand(Register rn, int64_t offset=0)
MemOperand(Register ra, Register rb)
MemOperand(Register ra, Register rb, int64_t offset)
intptr_t immediate() const
V8_INLINE Operand(Tagged< Smi > value)
V8_INLINE Operand(const ExternalReference &f)
bool must_output_reloc_info(const Assembler *assembler) const
Operand(Handle< HeapObject > handle)
HeapNumberRequest heap_number_request() const
bool IsHeapNumberRequest() const
V8_INLINE bool is_reg() const
static Operand EmbeddedNumber(double number)
V8_INLINE Operand(intptr_t immediate, RelocInfo::Mode rmode=RelocInfo::NO_INFO)
static V8_INLINE Operand Zero()
int32_t immediate() const
V8_INLINE Operand(Register rm)
PatchingAssembler(const AssemblerOptions &options, uint8_t *address, int instructions)
static constexpr CRegister no_reg()
constexpr int8_t code() const
static constexpr int kMaxSize
static constexpr bool IsShareableRelocMode(Mode mode)
static constexpr bool IsWasmCall(Mode mode)
static constexpr bool IsWasmStubCall(Mode mode)
static constexpr bool IsNoInfo(Mode mode)
UseScratchRegisterScope(Assembler *assembler)
~UseScratchRegisterScope()
#define V8_EMBEDDED_CONSTANT_POOL_BOOL
#define PPC_VX_OPCODE_A_FORM_LIST(V)
#define PPC_PREFIX_OPCODE_TYPE_00_LIST(V)
#define PPC_X_OPCODE_EH_L_FORM_LIST(V)
#define PPC_VX_OPCODE_G_FORM_LIST(V)
#define PPC_VA_OPCODE_A_FORM_LIST(V)
#define PPC_VX_OPCODE_C_FORM_LIST(V)
#define PPC_X_OPCODE_D_FORM_LIST(V)
#define PPC_VX_OPCODE_B_FORM_LIST(V)
#define PPC_VX_OPCODE_D_FORM_LIST(V)
#define PPC_XX3_OPCODE_SCALAR_LIST(V)
#define PPC_X_OPCODE_F_FORM_LIST(V)
#define PPC_XX2_OPCODE_VECTOR_A_FORM_LIST(V)
#define PPC_X_OPCODE_C_FORM_LIST(V)
#define PPC_X_OPCODE_B_FORM_LIST(V)
#define PPC_XX3_OPCODE_VECTOR_B_FORM_LIST(V)
#define PPC_X_OPCODE_G_FORM_LIST(V)
#define PPC_X_OPCODE_A_FORM_LIST(V)
#define PPC_XX3_OPCODE_VECTOR_A_FORM_LIST(V)
#define PPC_VX_OPCODE_E_FORM_LIST(V)
#define PPC_VC_OPCODE_LIST(V)
#define PPC_X_OPCODE_EH_S_FORM_LIST(V)
#define PPC_VX_OPCODE_F_FORM_LIST(V)
#define PPC_X_OPCODE_E_FORM_LIST(V)
#define PPC_XX2_OPCODE_B_FORM_LIST(V)
#define PPC_XX2_OPCODE_SCALAR_A_FORM_LIST(V)
#define PPC_PREFIX_OPCODE_TYPE_10_LIST(V)
BytecodeAssembler & assembler_
constexpr Register no_reg
constexpr int32_t kDefaultStopCode
std::variant< Zone *, AccountingAllocator * > MaybeAssemblerZone
@ kExt2OpcodeVariant2Mask
constexpr int kSystemPointerSize
Condition NegateCondition(Condition cond)
constexpr uint8_t kInstrSize
constexpr MiscInstructionsBits74 BX
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
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK(condition)
#define V8_EXPORT_PRIVATE