40#ifndef V8_CODEGEN_ARM_ASSEMBLER_ARM_H_
41#define V8_CODEGEN_ARM_ASSEMBLER_ARM_H_
58class SafepointTableBuilder;
90 value_.immediate = immediate;
117 static Operand EmbeddedNumber(
double number);
121 return rm_.is_valid() && rs_ ==
no_reg && shift_op_ ==
LSL &&
126 return rm_.is_valid() && !rs_.is_valid();
130 return rm_.is_valid() && rs_.is_valid();
149 DCHECK(!IsHeapNumberRequest());
155 DCHECK(IsHeapNumberRequest());
156 return value_.heap_number_request;
161 rmode_ == RelocInfo::FULL_EMBEDDED_OBJECT ||
162 rmode_ == RelocInfo::CODE_TARGET);
163 return is_heap_number_request_;
180 bool is_heap_number_request_ =
false;
217 DCHECK(IsImmediateOffset());
222 DCHECK(IsImmediateOffset());
258 int align()
const {
return align_; }
309 std::unique_ptr<AssemblerBuffer> = {});
312 std::unique_ptr<AssemblerBuffer> buffer = {})
315 ~Assembler()
override;
321 pending_32_bit_constants_.clear();
322 first_const_pool_32_use_ = -1;
323 constant_pool_deadline_ =
kMaxInt;
327 static constexpr int kNoHandlerTable = 0;
331 int handler_table_offset);
337 GetCode(isolate, desc, kNoSafepointTable, kNoHandlerTable);
364 V8_INLINE static bool is_constant_pool_load(Address
pc);
368 V8_INLINE static Address constant_pool_entry_address(Address
pc,
369 Address constant_pool);
373 V8_INLINE static Address target_address_at(Address
pc, Address constant_pool);
374 V8_INLINE static void set_target_address_at(
375 Address
pc, Address constant_pool, Address target,
380 inline static int deserialization_special_target_size(Address location);
383 inline static void deserialization_set_target_internal_reference_at(
388 static inline uint32_t uint32_constant_at(Address
pc, Address constant_pool);
389 static inline void set_uint32_constant_at(
390 Address
pc, Address constant_pool, uint32_t new_constant,
401 return &scratch_vfp_register_list_;
413 void DataAlign(
int m);
415 void CodeTargetAlign();
423 void blx(
int branch_offset);
732 const Register extra_scratch = no_reg);
1006 NON_MARKING_NOP = 0,
1014 FIRST_IC_MARKER = PROPERTY_ACCESS_INLINED
1030 vstm(
db_w, sp, src.low(), src.high(), cond);
1034 vstm(
db_w, sp, src, src, cond);
1038 vstm(
db_w, sp, src, src, cond);
1042 vldm(
ia_w, sp, dst, dst, cond);
1068 assem_->StartBlockConstPool();
1109 void db(uint8_t data);
1110 void dd(uint32_t data);
1111 void dq(uint64_t data);
1112 void dp(uintptr_t data) { dd(data); }
1116 return *
reinterpret_cast<Instr*
>(buffer_start_ +
pos);
1173 static constexpr int kMaxDistToPcRelativeConstant =
1174 4095 + Instruction::kPcLoadDelta;
1178 static constexpr int kMaxDistToIntPool =
1179 kMaxDistToPcRelativeConstant - 2 *
kInstrSize;
1181 static constexpr int kTypicalNumPending32Constants = 32;
1185 static constexpr int kMaxNumPending32Constants =
1197 CheckConstPool(
false,
true);
1221 if (const_pool_blocked_nesting_++ == 0) {
1223 constant_pool_deadline_ =
kMaxInt;
1230 if (--const_pool_blocked_nesting_ == 0) {
1231 if (first_const_pool_32_use_ >= 0) {
1237 constant_pool_deadline_ = first_const_pool_32_use_ + kCheckPoolDeadline;
1243 return (const_pool_blocked_nesting_ > 0) ||
1248 bool result = !pending_32_bit_constants_.empty();
1255 return IsEnabled(VFP32DREGS) ||
1256 (
reg.code() < LowDwVfpRegister::kNumRegisters);
1261 return IsEnabled(VFP32DREGS) ||
1262 (
reg.code() < LowDwVfpRegister::kNumRegisters / 2);
1265 inline void emit(
Instr x);
1272 static constexpr int kGap = 32;
1273 static_assert(AssemblerBase::kMinimalBufferSize >= 2 * kGap);
1277 static constexpr int kMaxRelocSize = RelocInfoWriter::kMaxSize;
1297 static const int kMaximalBufferSize = 512 *
MB;
1315 static constexpr int kCheckPoolDeadline = kMaxDistToIntPool - 2 * kGap;
1350 void print(
const Label* L);
1358 void AllocateAndInstallRequestedHeapNumbers(
LocalIsolate* isolate);
1360 int WriteCodeComments();
1373class PatchingAssembler :
public Assembler {
1396 old_available_(*assembler->GetScratchRegisterList()),
1397 old_available_vfp_(*assembler->GetScratchVfpRegisterList()) {}
1400 *
assembler_->GetScratchRegisterList() = old_available_;
1401 *
assembler_->GetScratchVfpRegisterList() = old_available_vfp_;
1406 return assembler_->GetScratchRegisterList()->PopFirst();
1423 return !
assembler_->GetScratchRegisterList()->is_empty();
1431 *
assembler_->GetScratchRegisterList() = available;
1436 *
assembler_->GetScratchVfpRegisterList() = available;
1442 DCHECK(!available->has(reg1));
1443 DCHECK(!available->has(reg2));
1444 available->set(reg1);
1445 available->set(reg2);
1450 *available = *available | list;
1456 *available = *available | list;
1461 DCHECK(available->has(reg1));
1463 available->clear(
RegList{reg1, reg2});
1468 DCHECK_EQ((*available | list), *available);
1469 *available = *available & ~list;
1476 template <
typename T>
1477 bool CanAcquireVfp()
const;
1479 template <
typename T>
DISALLOW_IMPLICIT_CONSTRUCTORS(BlockConstPoolScope)
BlockConstPoolScope(Assembler *assem)
void vcmp(const DwVfpRegister src1, const double src2, const Condition cond=al)
void AddrMode1(Instr instr, Register rd, Register rn, const Operand &x)
void vsub(NeonSize size, QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void vmov(NeonDataType dt, Register dst, DwVfpRegister src, int index)
void vdup(NeonSize size, DwVfpRegister dst, DwVfpRegister src, int index)
void uxtb(Register dst, Register src, int rotate=0, Condition cond=al)
void vshl(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src, int shift)
void vmin(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void rsb(Register dst, Register src1, const Operand &src2, SBit s=LeaveCC, Condition cond=al)
void vceq(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void vstr(const SwVfpRegister src, const Register base, int offset, const Condition cond=al)
void GetCode(LocalIsolate *isolate, CodeDesc *desc)
RelocInfoWriter reloc_info_writer
void pkhtb(Register dst, Register src1, const Operand &src2, Condition cond=al)
void vrintp(const DwVfpRegister dst, const DwVfpRegister src)
void cmp(Register src1, Register src2, Condition cond=al)
void vmrs(const Register dst, const Condition cond=al)
void vmovl(NeonDataType dt, QwNeonRegister dst, DwVfpRegister src)
void umlal(Register dstL, Register dstH, Register src1, Register src2, SBit s=LeaveCC, Condition cond=al)
void vcvt_u32_f64(const SwVfpRegister dst, const DwVfpRegister src, VFPConversionMode mode=kDefaultRoundToZero, const Condition cond=al)
void Move32BitImmediate(Register rd, const Operand &x, Condition cond=al)
void ldrd(Register dst1, Register dst2, const MemOperand &src, Condition cond=al)
void b(Label *L, Condition cond=al)
bool VfpRegisterIsAvailable(QwNeonRegister reg)
void vqsub(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
static bool IsPush(Instr instr)
void vmov(QwNeonRegister dst, QwNeonRegister src)
void vcvt_f32_s32(QwNeonRegister dst, QwNeonRegister src)
void usat(Register dst, int satpos, const Operand &src, Condition cond=al)
static bool IsLdrRegFpOffset(Instr instr)
void vswp(QwNeonRegister dst, QwNeonRegister src)
void vshr(NeonDataType dt, DwVfpRegister dst, DwVfpRegister src, int shift)
void and_(Register dst, Register src1, const Operand &src2, SBit s=LeaveCC, Condition cond=al)
void vldr(const SwVfpRegister dst, const MemOperand &src, const Condition cond=al)
void vneg(const DwVfpRegister dst, const DwVfpRegister src, const Condition cond=al)
void vmov(DwVfpRegister dst, uint64_t imm)
void vrecps(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
static bool IsCmpRegister(Instr instr)
void vldm(BlockAddrMode am, Register base, DwVfpRegister first, DwVfpRegister last, Condition cond=al)
void AddrMode5(Instr instr, CRegister crd, const MemOperand &x)
void RecordConstPool(int size)
bool has_pending_constants() const
static int GetCmpImmediateRawImmediate(Instr instr)
void vuzp(NeonSize size, QwNeonRegister src1, QwNeonRegister src2)
void vzip(NeonSize size, DwVfpRegister src1, DwVfpRegister src2)
VfpRegList scratch_vfp_register_list_
void bfi(Register dst, Register src, int lsb, int width, Condition cond=al)
void vadd(const SwVfpRegister dst, const SwVfpRegister src1, const SwVfpRegister src2, const Condition cond=al)
void mov_label_offset(Register dst, Label *label)
void cdp(Coprocessor coproc, int opcode_1, CRegister crd, CRegister crn, CRegister crm, int opcode_2, Condition cond=al)
void cmp_raw_immediate(Register src1, int raw_immediate, Condition cond=al)
void ldc2(Coprocessor coproc, CRegister crd, const MemOperand &src, LFlag l=Short)
void strex(Register src1, Register src2, Register dst, Condition cond=al)
void mls(Register dst, Register src1, Register src2, Register srcA, Condition cond=al)
void vcge(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void smull(Register dstL, Register dstH, Register src1, Register src2, SBit s=LeaveCC, Condition cond=al)
void mcr(Coprocessor coproc, int opcode_1, Register rd, CRegister crn, CRegister crm, int opcode_2=0, Condition cond=al)
void vrinta(const SwVfpRegister dst, const SwVfpRegister src)
static Instr SetLdrRegisterImmediateOffset(Instr instr, int offset)
void vrsqrts(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
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)
static bool IsPop(Instr instr)
void mrc(Coprocessor coproc, int opcode_1, Register rd, CRegister crn, CRegister crm, int opcode_2=0, Condition cond=al)
void sbc(Register dst, Register src1, const Operand &src2, SBit s=LeaveCC, Condition cond=al)
static VfpRegList DefaultFPTmpList()
static bool IsStrRegisterImmediate(Instr instr)
void veor(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void vmaxnm(const SwVfpRegister dst, const SwVfpRegister src1, const SwVfpRegister src2)
void stm(BlockAddrMode am, Register base, RegList src, Condition cond=al)
void vmls(const SwVfpRegister dst, const SwVfpRegister src1, const SwVfpRegister src2, const Condition cond=al)
void vmsr(const Register dst, const Condition cond=al)
int first_const_pool_32_use_
void vdiv(const SwVfpRegister dst, const SwVfpRegister src1, const SwVfpRegister src2, const Condition cond=al)
void vrintz(const DwVfpRegister dst, const DwVfpRegister src, const Condition cond=al)
void vcvt_f32_u32(const SwVfpRegister dst, const SwVfpRegister src, VFPConversionMode mode=kDefaultRoundToZero, const Condition cond=al)
void sxtb(Register dst, Register src, int rotate=0, Condition cond=al)
void smmla(Register dst, Register src1, Register src2, Register srcA, Condition cond=al)
void vpadd(DwVfpRegister dst, DwVfpRegister src1, DwVfpRegister src2)
static bool IsCmpImmediate(Instr instr)
void vstr(const SwVfpRegister src, const MemOperand &dst, const Condition cond=al)
void ConstantPoolAddEntry(int position, RelocInfo::Mode rmode, intptr_t value)
void vmul(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void mul(Register dst, Register src1, Register src2, SBit s=LeaveCC, Condition cond=al)
void adc(Register dst, Register src1, const Operand &src2, SBit s=LeaveCC, Condition cond=al)
void vminnm(const DwVfpRegister dst, const DwVfpRegister src1, const DwVfpRegister src2)
void push(Register src, Condition cond=al)
void vadd(NeonSize size, QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void vcvt_u32_f32(QwNeonRegister dst, QwNeonRegister src)
static bool IsTstImmediate(Instr instr)
static bool IsNop(Instr instr, int type=NON_MARKING_NOP)
void vrintm(const DwVfpRegister dst, const DwVfpRegister src)
int InstructionsGeneratedSince(Label *label)
bool ImmediateFitsAddrMode2Instruction(int32_t imm32)
void vceq(NeonSize size, QwNeonRegister dst, QwNeonRegister src, int value)
void bl(Condition cond, Label *L)
static Instr SetVldrDRegisterImmediateOffset(Instr instr, int offset)
void vldr(const DwVfpRegister dst, const MemOperand &src, const Condition cond=al)
void add(Register dst, Register src1, const Operand &src2, SBit s=LeaveCC, Condition cond=al)
void CheckConstPool(bool force_emit, bool require_jump)
void vmin(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void vdup(NeonSize size, QwNeonRegister dst, DwVfpRegister src, int index)
void uxtab(Register dst, Register src1, Register src2, int rotate=0, Condition cond=al)
void instr_at_put(int pos, Instr instr)
void teq(Register src1, const Operand &src2, Condition cond=al)
void sub(Register dst, Register src1, Register src2, SBit s=LeaveCC, Condition cond=al)
void sbfx(Register dst, Register src, int lsb, int width, Condition cond=al)
void vmvn(QwNeonRegister dst, QwNeonRegister src)
void vtst(NeonSize size, QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void vldm(BlockAddrMode am, Register base, SwVfpRegister first, SwVfpRegister last, Condition cond=al)
void bl(int branch_offset, Condition cond=al, RelocInfo::Mode rmode=RelocInfo::NO_INFO)
void vmov(const SwVfpRegister dst, Float32 imm)
void StartBlockConstPool()
void vsqrt(const DwVfpRegister dst, const DwVfpRegister src, const Condition cond=al)
void vld1r(NeonSize size, const NeonListOperand &dst, const NeonMemOperand &src)
void msr(SRegisterFieldMask fields, const Operand &src, Condition cond=al)
void vrintz(NeonDataType dt, const QwNeonRegister dst, const QwNeonRegister src)
void vcvt_f64_s32(const DwVfpRegister dst, const SwVfpRegister src, VFPConversionMode mode=kDefaultRoundToZero, const Condition cond=al)
void vneg(QwNeonRegister dst, QwNeonRegister src)
void vpadal(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src)
void vmul(NeonSize size, QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void vmls(const DwVfpRegister dst, const DwVfpRegister src1, const DwVfpRegister src2, const Condition cond=al)
static Instr SetAddRegisterImmediateOffset(Instr instr, int offset)
void bl(Label *L, Condition cond=al)
void cmp(Register src1, const Operand &src2, Condition cond=al)
void vcvt_f32_u32(QwNeonRegister dst, QwNeonRegister src)
void ldrexb(Register dst, Register src, Condition cond=al)
void BlockConstPoolFor(int instructions)
void rsc(Register dst, Register src1, const Operand &src2, SBit s=LeaveCC, Condition cond=al)
@ PROPERTY_ACCESS_INLINED
@ PROPERTY_ACCESS_INLINED_CONTEXT
@ PROPERTY_ACCESS_INLINED_CONTEXT_DONT_DELETE
void vmov(const DwVfpRegister dst, base::Double imm, const Register extra_scratch=no_reg)
void mov(Register dst, Register src, SBit s=LeaveCC, Condition cond=al)
void sxth(Register dst, Register src, int rotate=0, Condition cond=al)
void vsli(NeonSize size, DwVfpRegister dst, DwVfpRegister src, int shift)
bool VfpRegisterIsAvailable(DwVfpRegister reg)
void vqmovn(NeonDataType dst_dt, NeonDataType src_dt, DwVfpRegister dst, QwNeonRegister src)
void vshr(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src, int shift)
void lsr(Register dst, Register src1, const Operand &src2, SBit s=LeaveCC, Condition cond=al)
void vmla(const DwVfpRegister dst, const DwVfpRegister src1, const DwVfpRegister src2, const Condition cond=al)
void eor(Register dst, Register src1, Register src2, SBit s=LeaveCC, Condition cond=al)
void vtbl(DwVfpRegister dst, const NeonListOperand &list, DwVfpRegister index)
void vpush(DwVfpRegister src, Condition cond=al)
void sxtah(Register dst, Register src1, Register src2, int rotate=0, Condition cond=al)
void vpmin(NeonDataType dt, DwVfpRegister dst, DwVfpRegister src1, DwVfpRegister src2)
void ldr_pcrel(Register dst, int imm12, Condition cond=al)
void vrecpe(QwNeonRegister dst, QwNeonRegister src)
VfpRegList * GetScratchVfpRegisterList()
static bool IsMovImmed(Instr instr)
void vzip(NeonSize size, QwNeonRegister src1, QwNeonRegister src2)
static Instr SetStrRegisterImmediateOffset(Instr instr, int offset)
static bool IsVldrDPcImmediateOffset(Instr instr)
static Register GetRn(Instr instr)
void blx(Register target, Condition cond=al)
static bool IsStrRegFpOffset(Instr instr)
void vabs(QwNeonRegister dst, QwNeonRegister src)
void vsra(NeonDataType size, DwVfpRegister dst, DwVfpRegister src, int imm)
void ldrsh(Register dst, const MemOperand &src, Condition cond=al)
void vcvt_f64_s32(const DwVfpRegister dst, int fraction_bits, const Condition cond=al)
void vneg(const SwVfpRegister dst, const SwVfpRegister src, const Condition cond=al)
void vpaddl(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src)
RegList * GetScratchRegisterList()
void AddrMode3(Instr instr, Register rd, const MemOperand &x)
void vsel(const Condition cond, const SwVfpRegister dst, const SwVfpRegister src1, const SwVfpRegister src2)
V8_INLINE void MaybeCheckConstPool()
void ldrsb(Register dst, const MemOperand &src, Condition cond=al)
void vsqrt(const SwVfpRegister dst, const SwVfpRegister src, const Condition cond=al)
void smlal(Register dstL, Register dstH, Register src1, Register src2, SBit s=LeaveCC, Condition cond=al)
void pop(Register dst, Condition cond=al)
void vpop(DwVfpRegister dst, Condition cond=al)
void vcvt_f64_f32(const DwVfpRegister dst, const SwVfpRegister src, VFPConversionMode mode=kDefaultRoundToZero, const Condition cond=al)
static Instr EncodeMovwImmediate(uint32_t immediate)
void str(Register src, const MemOperand &dst, Condition cond=al)
void vstm(BlockAddrMode am, Register base, DwVfpRegister first, DwVfpRegister last, Condition cond=al)
void ldrexd(Register dst1, Register dst2, Register src, Condition cond=al)
void and_(Register dst, Register src1, Register src2, SBit s=LeaveCC, Condition cond=al)
void b(Condition cond, Label *L)
void ldrh(Register dst, const MemOperand &src, Condition cond=al)
void rbit(Register dst, Register src, Condition cond=al)
void vmlal(NeonDataType size, QwNeonRegister dst, DwVfpRegister src1, DwVfpRegister src2)
void vcge(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void vmul(const SwVfpRegister dst, const SwVfpRegister src1, const SwVfpRegister src2, const Condition cond=al)
void strd(Register src1, Register src2, const MemOperand &dst, Condition cond=al)
void clz(Register dst, Register src, Condition cond=al)
static Register GetRm(Instr instr)
void vbsl(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void vadd(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void mrc2(Coprocessor coproc, int opcode_1, Register rd, CRegister crn, CRegister crm, int opcode_2=0)
static Instr GetMovWPattern()
void vrev16(NeonSize size, QwNeonRegister dst, QwNeonRegister src)
void vmla(const SwVfpRegister dst, const SwVfpRegister src1, const SwVfpRegister src2, const Condition cond=al)
void ldc2(Coprocessor coproc, CRegister crd, Register base, int option, LFlag l=Short)
void vcvt_u32_f32(const SwVfpRegister dst, const SwVfpRegister src, VFPConversionMode mode=kDefaultRoundToZero, const Condition cond=al)
void dmb(BarrierOption option)
void sub(Register dst, Register src1, const Operand &src2, SBit s=LeaveCC, Condition cond=al)
void vmov(const DwVfpRegister dst, const DwVfpRegister src, const Condition cond=al)
static Instr PatchShiftImm(Instr instr, int immed)
void movw(Register reg, uint32_t immediate, Condition cond=al)
void vrintp(NeonDataType dt, const QwNeonRegister dst, const QwNeonRegister src)
void vrinta(const DwVfpRegister dst, const DwVfpRegister src)
void vorr(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void vrintn(const SwVfpRegister dst, const SwVfpRegister src)
void udiv(Register dst, Register src1, Register src2, Condition cond=al)
void vrhadd(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void uxtb16(Register dst, Register src, int rotate=0, Condition cond=al)
void vclt(NeonSize size, QwNeonRegister dst, QwNeonRegister src, int value)
void vmax(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
int const_pool_blocked_nesting_
static Register GetRd(Instr instr)
void vminnm(const SwVfpRegister dst, const SwVfpRegister src1, const SwVfpRegister src2)
void vmov(const DwVfpRegister dst, const Register src1, const Register src2, const Condition cond=al)
void vorn(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void AddrMode2(Instr instr, Register rd, const MemOperand &x)
void vtrn(NeonSize size, QwNeonRegister src1, QwNeonRegister src2)
void vcgt(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void vld1(NeonSize size, const NeonListOperand &dst, const NeonMemOperand &src)
static bool IsMovW(Instr instr)
void pkhbt(Register dst, Register src1, const Operand &src2, Condition cond=al)
void vsri(NeonSize size, DwVfpRegister dst, DwVfpRegister src, int shift)
void vrintz(const SwVfpRegister dst, const SwVfpRegister src, const Condition cond=al)
static void instr_at_put(Address pc, Instr instr)
void vstr(const DwVfpRegister src, const MemOperand &dst, const Condition cond=al)
static Register GetCmpImmediateRegister(Instr instr)
void strb(Register src, const MemOperand &dst, Condition cond=al)
bool AddrMode1TryEncodeOperand(Instr *instr, const Operand &x)
void blx(int branch_offset)
static bool IsMovT(Instr instr)
void veor(DwVfpRegister dst, DwVfpRegister src1, DwVfpRegister src2)
int constant_pool_deadline_
void lsl(Register dst, Register src1, const Operand &src2, SBit s=LeaveCC, Condition cond=al)
void vqrdmulh(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void ldrb(Register dst, const MemOperand &src, Condition cond=al)
void vcvt_f32_f64(const SwVfpRegister dst, const DwVfpRegister src, VFPConversionMode mode=kDefaultRoundToZero, const Condition cond=al)
void vand(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
bool is_const_pool_blocked() const
void strexd(Register res, Register src1, Register src2, Register dst, Condition cond=al)
void vpmax(NeonDataType dt, DwVfpRegister dst, DwVfpRegister src1, DwVfpRegister src2)
void mla(Register dst, Register src1, Register src2, Register srcA, SBit s=LeaveCC, Condition cond=al)
void eor(Register dst, Register src1, const Operand &src2, SBit s=LeaveCC, Condition cond=al)
static bool IsVldrDRegisterImmediate(Instr instr)
void uxth(Register dst, Register src, int rotate=0, Condition cond=al)
void vabs(const DwVfpRegister dst, const DwVfpRegister src, const Condition cond=al)
void mvn(Register dst, const Operand &src, SBit s=LeaveCC, Condition cond=al)
void mov(Register dst, const Operand &src, SBit s=LeaveCC, Condition cond=al)
void vswp(DwVfpRegister dst, DwVfpRegister src)
void vdiv(const DwVfpRegister dst, const DwVfpRegister src1, const DwVfpRegister src2, const Condition cond=al)
void svc(uint32_t imm24, Condition cond=al)
void isb(BarrierOption option)
void MaybeEmitOutOfLineConstantPool()
void vrintm(NeonDataType dt, const QwNeonRegister dst, const QwNeonRegister src)
void strh(Register src, const MemOperand &dst, Condition cond=al)
void ubfx(Register dst, Register src, int lsb, int width, Condition cond=al)
void vst1s(NeonSize size, const NeonListOperand &src, uint8_t index, const NeonMemOperand &dst)
void vstm(BlockAddrMode am, Register base, SwVfpRegister first, SwVfpRegister last, Condition cond=al)
void vrintp(const SwVfpRegister dst, const SwVfpRegister src)
void dsb(BarrierOption option)
void mrs(Register dst, SRegister s, Condition cond=al)
void rev(Register dst, Register src, Condition cond=al)
void ldc(Coprocessor coproc, CRegister crd, const MemOperand &src, LFlag l=Short, Condition cond=al)
void vcmp(const DwVfpRegister src1, const DwVfpRegister src2, const Condition cond=al)
void vcvt_f64_u32(const DwVfpRegister dst, const SwVfpRegister src, VFPConversionMode mode=kDefaultRoundToZero, const Condition cond=al)
void orr(Register dst, Register src1, Register src2, SBit s=LeaveCC, Condition cond=al)
static bool IsOrrImmed(Instr instr)
static Instr instr_at(Address pc)
static int GetVldrDRegisterImmediateOffset(Instr instr)
void vsub(const SwVfpRegister dst, const SwVfpRegister src1, const SwVfpRegister src2, const Condition cond=al)
void vrintm(const SwVfpRegister dst, const SwVfpRegister src)
void vsel(const Condition cond, const DwVfpRegister dst, const DwVfpRegister src1, const DwVfpRegister src2)
void target_at_put(int pos, int target_pos)
void uxtah(Register dst, Register src1, Register src2, int rotate=0, Condition cond=al)
void sdiv(Register dst, Register src1, Register src2, Condition cond=al)
void vabs(const SwVfpRegister dst, const SwVfpRegister src, const Condition cond=al)
void vcvt_s32_f64(const SwVfpRegister dst, const DwVfpRegister src, VFPConversionMode mode=kDefaultRoundToZero, const Condition cond=al)
static RegList DefaultTmpList()
static int DecodeShiftImm(Instr instr)
void umull(Register dstL, Register dstH, Register src1, Register src2, SBit s=LeaveCC, Condition cond=al)
void vqadd(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void vdup(NeonSize size, QwNeonRegister dst, Register src)
void vcvt_s32_f32(const SwVfpRegister dst, const SwVfpRegister src, VFPConversionMode mode=kDefaultRoundToZero, const Condition cond=al)
void strexh(Register src1, Register src2, Register dst, Condition cond=al)
void vld1s(NeonSize size, const NeonListOperand &dst, uint8_t index, const NeonMemOperand &src)
void vpadd(NeonSize size, DwVfpRegister dst, DwVfpRegister src1, DwVfpRegister src2)
void vabs(NeonSize size, QwNeonRegister dst, QwNeonRegister src)
void vrsqrte(QwNeonRegister dst, QwNeonRegister src)
void movt(Register reg, uint32_t immediate, Condition cond=al)
void orr(Register dst, Register src1, const Operand &src2, SBit s=LeaveCC, Condition cond=al)
void ldm(BlockAddrMode am, Register base, RegList dst, Condition cond=al)
void vmov(QwNeonRegister dst, uint64_t imm)
void vmov(const Register dst, const SwVfpRegister src, const Condition cond=al)
void smmul(Register dst, Register src1, Register src2, Condition cond=al)
void AddrMode4(Instr instr, Register rn, RegList rl)
static bool IsLdrPcImmediateOffset(Instr instr)
void vstr(const DwVfpRegister src, const Register base, int offset, const Condition cond=al)
void vmov(const SwVfpRegister dst, const Register src, const Condition cond=al)
void vsub(const DwVfpRegister dst, const DwVfpRegister src1, const DwVfpRegister src2, const Condition cond=al)
void vmov(NeonDataType dt, DwVfpRegister dst, int index, Register src)
void tst(Register src1, const Operand &src2, Condition cond=al)
void vcvt_f32_s32(const SwVfpRegister dst, const SwVfpRegister src, VFPConversionMode mode=kDefaultRoundToZero, const Condition cond=al)
void vpush(SwVfpRegister src, Condition cond=al)
int no_const_pool_before_
void pld(const MemOperand &address)
static bool ImmediateFitsAddrMode1Instruction(int32_t imm32)
void vext(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2, int bytes)
void ldr(Register dst, const MemOperand &src, Condition cond=al)
void bic(Register dst, Register src1, const Operand &src2, SBit s=LeaveCC, Condition cond=al)
void vshl(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src, QwNeonRegister shift)
void vrev32(NeonSize size, QwNeonRegister dst, QwNeonRegister src)
void vmul(const DwVfpRegister dst, const DwVfpRegister src1, const DwVfpRegister src2, const Condition cond=al)
static Condition GetCondition(Instr instr)
static bool IsBlxIp(Instr instr)
void mcr2(Coprocessor coproc, int opcode_1, Register rd, CRegister crn, CRegister crm, int opcode_2=0)
void tst(Register src1, Register src2, Condition cond=al)
void vcnt(QwNeonRegister dst, QwNeonRegister src)
static bool IsBlxReg(Instr instr)
void vtrn(NeonSize size, DwVfpRegister src1, DwVfpRegister src2)
void vmov(const Register dst1, const Register dst2, const DwVfpRegister src, const Condition cond=al)
void ldrexh(Register dst, Register src, Condition cond=al)
void vadd(const DwVfpRegister dst, const DwVfpRegister src1, const DwVfpRegister src2, const Condition cond=al)
void bkpt(uint32_t imm16)
void vbic(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void cdp2(Coprocessor coproc, int opcode_1, CRegister crd, CRegister crn, CRegister crm, int opcode_2)
static bool IsBOrBlPcImmediateOffset(Instr instr)
void vtbx(DwVfpRegister dst, const NeonListOperand &list, DwVfpRegister index)
void vcmp(const SwVfpRegister src1, const float src2, const Condition cond=al)
void vmov(const SwVfpRegister dst, const SwVfpRegister src, const Condition cond=al)
void ldrex(Register dst, Register src, Condition cond=al)
base::SmallVector< ConstantPoolEntry, kTypicalNumPending32Constants > pending_32_bit_constants_
void bx(Register target, Condition cond=al)
void vst1(NeonSize size, const NeonListOperand &src, const NeonMemOperand &dst)
static Instr PatchMovwImmediate(Instr instruction, uint32_t immediate)
static bool IsAddRegisterImmediate(Instr instr)
void strexb(Register src1, Register src2, Register dst, Condition cond=al)
void vcgt(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void vmaxnm(const DwVfpRegister dst, const DwVfpRegister src1, const DwVfpRegister src2)
void vcmp(const SwVfpRegister src1, const SwVfpRegister src2, const Condition cond=al)
void vrintn(const DwVfpRegister dst, const DwVfpRegister src)
void ldc(Coprocessor coproc, CRegister crd, Register base, int option, LFlag l=Short, Condition cond=al)
void vneg(NeonSize size, QwNeonRegister dst, QwNeonRegister src)
void sxtab(Register dst, Register src1, Register src2, int rotate=0, Condition cond=al)
static bool IsStrRegFpNegOffset(Instr instr)
static bool IsLdrRegisterImmediate(Instr instr)
void AbortedCodeGeneration() override
void vsub(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void stop(Condition cond=al, int32_t code=kDefaultStopCode)
static int GetLdrRegisterImmediateOffset(Instr instr)
int SizeOfCodeGeneratedSince(Label *label)
void vldr(const DwVfpRegister dst, const Register base, int offset, const Condition cond=al)
void vuzp(NeonSize size, DwVfpRegister src1, DwVfpRegister src2)
void vmull(NeonDataType size, QwNeonRegister dst, DwVfpRegister src1, DwVfpRegister src2)
void cmn(Register src1, const Operand &src2, Condition cond=al)
RegList scratch_register_list_
static bool IsLdrRegFpNegOffset(Instr instr)
static Instr GetMovTPattern()
void vpush(QwNeonRegister src, Condition cond=al)
void bfc(Register dst, int lsb, int width, Condition cond=al)
void add(Register dst, Register src1, Register src2, SBit s=LeaveCC, Condition cond=al)
void vmax(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
void vcvt_s32_f32(QwNeonRegister dst, QwNeonRegister src)
void vrintn(NeonDataType dt, const QwNeonRegister dst, const QwNeonRegister src)
void asr(Register dst, Register src1, const Operand &src2, SBit s=LeaveCC, Condition cond=al)
void vrev64(NeonSize size, QwNeonRegister dst, QwNeonRegister src)
void vldr(const SwVfpRegister dst, const Register base, int offset, const Condition cond=al)
void vceq(NeonSize size, QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2)
V8_INLINE EnsureSpace(Assembler *assembler)
LoadStoreLaneParams(MachineRepresentation rep, uint8_t laneidx)
LoadStoreLaneParams(uint8_t laneidx, NeonSize sz, int lanes)
MemOperand(Register rn, Register rm, AddrMode am=Offset)
MemOperand(Register rn, int32_t offset=0, AddrMode am=Offset)
bool IsImmediateOffset() const
void set_offset(int32_t offset)
bool OffsetIsUint12Encodable() const
MemOperand(Register rn, Register rm, ShiftOp shift_op, int shift_imm, AddrMode am=Offset)
static V8_INLINE MemOperand PointerAddressFromSmiKey(Register array, Register key, AddrMode am=Offset)
DoubleRegister base() const
NeonListOperand(DoubleRegister base, int register_count=1)
NeonListOperand(QwNeonRegister q_reg)
NeonListType type() const
void SetAlignment(int align)
NeonMemOperand(Register rn, Register rm, int align=0)
NeonMemOperand(Register rn, AddrMode am=Offset, int align=0)
int InstructionsRequired(const Assembler *assembler, Instr instr=0) const
Operand(Register rm, ShiftOp shift_op, int shift_imm)
static V8_INLINE Operand SmiUntag(Register rm)
Operand(Register rm, ShiftOp shift_op, Register rs)
bool MustOutputRelocInfo(const Assembler *assembler) const
static V8_INLINE Operand PointerOffsetFromSmiKey(Register key)
Operand(Handle< HeapObject > handle)
HeapNumberRequest heap_number_request() const
static V8_INLINE Operand DoubleOffsetFromSmiKey(Register key)
bool IsHeapNumberRequest() const
bool IsImmediateShiftedRegister() const
bool IsRegisterShiftedRegister() const
V8_INLINE Operand(int32_t immediate, RelocInfo::Mode rmode=RelocInfo::NO_INFO)
int32_t immediate() const
PatchingAssembler(const AssemblerOptions &options, uint8_t *address, int instructions)
UseScratchRegisterScope(Assembler *assembler)
void Exclude(VfpRegList list)
void SetAvailableVfp(VfpRegList available)
~UseScratchRegisterScope()
void Include(RegList list)
VfpRegList AvailableVfp()
void Exclude(const Register ®1, const Register ®2=no_reg)
LowDwVfpRegister AcquireLowD()
void SetAvailable(RegList available)
void Include(const Register ®1, const Register ®2=no_reg)
void Include(VfpRegList list)
VfpRegList old_available_vfp_
QwNeonRegister AcquireQ()
BytecodeAssembler & assembler_
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
ZoneVector< RpoNumber > & result
constexpr Register no_reg
constexpr int kPointerSizeLog2
constexpr BlockAddrMode ia_w
std::variant< Zone *, AccountingAllocator * > MaybeAssemblerZone
constexpr AddrMode NegPreIndex
constexpr int kPointerSize
constexpr BlockAddrMode db_w
constexpr NeonListType nlt_3
uint32_t SRegisterFieldMask
constexpr NeonListType nlt_2
constexpr BlockAddrMode db
constexpr AddrMode PostIndex
constexpr uint8_t kInstrSize
constexpr int kDoubleSizeLog2
constexpr NeonListType nlt_1
constexpr NeonListType nlt_4
#define DCHECK_LE(v1, v2)
#define DCHECK_NOT_NULL(val)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define V8_EXPORT_PRIVATE
HeapNumberRequest heap_number_request
#define V8_UNLIKELY(condition)
std::unique_ptr< ValueMirror > key