5#ifndef RUNTIME_VM_COMPILER_ASSEMBLER_ASSEMBLER_ARM64_H_
6#define RUNTIME_VM_COMPILER_ASSEMBLER_ASSEMBLER_ARM64_H_
8#if defined(DART_PRECOMPILED_RUNTIME)
9#error "AOT runtime should not use compiler sources (including header files)"
12#ifndef RUNTIME_VM_COMPILER_ASSEMBLER_ASSEMBLER_H_
13#error Do not include assembler_arm64.h directly; use assembler.h instead.
29class FlowGraphCompiler;
85 value_ = other.value_;
92 int64_t
value()
const {
return value_; }
141 offset_(other.offset_) {}
146 offset_ = other.offset_;
203 (
static_cast<uint32_t
>(
offset) ==
214 addr.offset_ = pc_off;
221 return Address(rn, offset, at);
255 const int32_t offset = offset_;
267 FATAL(
"Offset %d is out of range\n", offset);
279 (
static_cast<uint32_t
>(offset) ==
280 ((
static_cast<uint32_t
>(offset) >>
scale) <<
scale)));
314 int32_t
offset()
const {
return offset_; }
325class FieldAddress :
public Address {
362 :
ValueObject(), encoding_(other.encoding_), type_(other.type_) {}
366 encoding_ = other.encoding_;
415 Operand(uint8_t n, int8_t imm_s, int8_t imm_r) {
416 ASSERT((n == 1) || (n == 0));
419 encoding_ = (
static_cast<int32_t
>(n) <<
kNShift) |
444 }
else if (((imm & 0xfff) == 0) && (
Utils::IsUint(12, imm >> 12))) {
457 uint32_t encoding()
const {
return encoding_; }
466class Assembler :
public AssemblerBase {
496 void Drop(intptr_t stack_elements) {
497 ASSERT(stack_elements >= 0);
498 if (stack_elements > 0) {
532 ASSERT(address.type() == Address::AddressType::Offset);
534 if (address.offset() != 0) {
539 if (FLAG_target_thread_sanitizer) {
544#if defined(DART_COMPRESSED_POINTERS)
555 ASSERT(address.type() == Address::AddressType::Offset);
557 if (address.offset() != 0) {
562 if (FLAG_target_thread_sanitizer) {
575 return FLAG_use_far_branches || use_far_branches_;
617 AddSubHelper(sz,
false,
false, rd, rn, o);
620 AddSubHelper(sz,
true,
false, rd, rn, o);
623 AddSubHelper(sz,
false,
true, rd, rn, o);
626 AddSubHelper(sz,
true,
true, rd, rn, o);
639 AddSubWithCarryHelper(
kEightBytes,
false,
false, rd, rn, rm);
642 AddSubWithCarryHelper(
kEightBytes,
true,
false, rd, rn, rm);
645 AddSubWithCarryHelper(
kFourBytes,
false,
false, rd, rn, rm);
648 AddSubWithCarryHelper(
kFourBytes,
true,
false, rd, rn, rm);
651 AddSubWithCarryHelper(
kEightBytes,
false,
true, rd, rn, rm);
654 AddSubWithCarryHelper(
kEightBytes,
true,
true, rd, rn, rm);
657 AddSubWithCarryHelper(
kFourBytes,
false,
true, rd, rn, rm);
660 AddSubWithCarryHelper(
kFourBytes,
true,
true, rd, rn, rm);
675 EmitBitfieldOp(
BFM, rd, rn, r_imm, s_imm,
size);
684 EmitBitfieldOp(
SBFM, rd, rn, r_imm, s_imm,
size);
693 EmitBitfieldOp(
UBFM, rd, rn, r_imm, s_imm,
size);
704 EmitBitfieldOp(
BFM, rd, rn, -low_bit & (wordsize - 1),
width - 1,
size);
714 EmitBitfieldOp(
BFM, rd, rn, low_bit, low_bit +
width - 1,
size);
726 EmitBitfieldOp(
SBFM, rd, rn, (wordsize - low_bit) & (wordsize - 1),
737 EmitBitfieldOp(
SBFM, rd, rn, low_bit, low_bit +
width - 1,
size);
749 ASSERT(low_bit < wordsize);
750 EmitBitfieldOp(
UBFM, rd, rn, (-low_bit) & (wordsize - 1),
width - 1,
size);
760 EmitBitfieldOp(
UBFM, rd, rn, low_bit, low_bit +
width - 1,
size);
803 EmitLogicalImmOp(
ANDI, rd, rn, imm_op, sz);
814 EmitLogicalImmOp(
ORRI, rd, rn, imm_op, sz);
825 EmitLogicalImmOp(
EORI, rd, rn, imm_op, sz);
836 EmitLogicalImmOp(
ANDIS, rd, rn, imm_op, sz);
841 EmitLogicalShiftOp(
AND, rd, rn, o, sz);
844 EmitLogicalShiftOp(
BIC, rd, rn, o, sz);
847 EmitLogicalShiftOp(
ORR, rd, rn, o, sz);
850 EmitLogicalShiftOp(
ORN, rd, rn, o, sz);
853 EmitLogicalShiftOp(
EOR, rd, rn, o, sz);
856 EmitLogicalShiftOp(
EON, rd, rn, o, sz);
859 EmitLogicalShiftOp(
ANDS, rd, rn, o, sz);
862 EmitLogicalShiftOp(
BICS, rd, rn, o, sz);
889 EmitMiscDP2Source(
UDIV, rd, rn, rm, sz);
895 EmitMiscDP2Source(
SDIV, rd, rn, rm, sz);
901 EmitMiscDP2Source(
LSLV, rd, rn, rm, sz);
907 EmitMiscDP2Source(
LSRV, rd, rn, rm, sz);
913 EmitMiscDP2Source(
ASRV, rd, rn, rm, sz);
932 EmitMiscDP3Source(
MADD, rd, rn, rm, ra, sz);
939 EmitMiscDP3Source(
MSUB, rd, rn, rm, ra, sz);
947 EmitMiscDP3Source(
SMULH, rd, rn, rm,
R31, sz);
955 EmitMiscDP3Source(
UMULH, rd, rn, rm,
R31, sz);
962 EmitMiscDP3Source(
UMADDL, rd, rn, rm, ra, sz);
970 EmitMiscDP3Source(
UMADDL, rd, rn, rm,
ZR, sz);
977 EmitMiscDP3Source(
SMADDL, rd, rn, rm, ra, sz);
985 EmitMiscDP3Source(
SMADDL, rd, rn, rm,
ZR, sz);
1013 EmitLoadRegLiteral(
LDRpc, rt,
a, sz);
1016 EmitLoadStoreReg(
LDRS, rt,
a, sz);
1018 EmitLoadStoreReg(
LDR, rt,
a, sz);
1027 EmitLoadStoreReg(
STR, rt,
a, sz);
1035 EmitLoadStoreRegPair(
LDP, rt, rt2,
a, sz);
1042 EmitLoadStoreRegPair(
STP, rt, rt2,
a, sz);
1048 EmitLoadStoreVRegPair(
FLDP, rt, rt2,
a, sz);
1054 EmitLoadStoreVRegPair(
FSTP, rt, rt2,
a, sz);
1071 EmitLoadStoreExclusive(
STXR, rs, rn, rt,
size);
1074 const int32_t encoding =
static_cast<int32_t
>(
CLREX);
1079 EmitLoadStoreExclusive(
LDAR,
R31, rn, rt, sz);
1083 EmitLoadStoreExclusive(
STLR,
R31, rn, rt, sz);
1093 EmitAtomicMemory(
LDCLR, rs, rn, rt, sz);
1102 EmitAtomicMemory(
LDSET, rs, rn, rt, sz);
1114 EmitConditionalSelect(
CSINC, rd, rn, rm, cond, sz);
1170 EmitUnconditionalBranch(
B, label);
1172 EmitConditionalBranch(
BCOND, cond, label);
1180 CLOBBERS_LR(EmitUnconditionalBranchOp(
BL,
offset));
1189 b(label, condition);
1197 intptr_t bit_number,
1201 if (condition ==
ZERO) {
1202 tbz(label, rn, bit_number);
1203 }
else if (condition ==
NOT_ZERO) {
1204 tbnz(label, rn, bit_number);
1211 EmitCompareAndBranch(
CBZ, rt, label, sz);
1215 EmitCompareAndBranch(
CBNZ, rt, label, sz);
1228 EmitTestAndBranch(
TBZ, rt, bit_number, label);
1231 EmitTestAndBranch(
TBNZ, rt, bit_number, label);
1239 CLOBBERS_LR(EmitUnconditionalBranchRegOp(
BLR, rn));
1246 READS_RETURN_ADDRESS_FROM_LR(rn =
LR);
1249 EmitUnconditionalBranchRegOp(
RET, rn);
1253 void brk(uint16_t imm) { EmitExceptionGenOp(
BRK, imm); }
1257 int64_t imm64 = bit_cast<int64_t, double>(immd);
1258 const uint8_t bit7 = imm64 >> 63;
1259 const uint8_t bit6 = (~(imm64 >> 62)) & 0x1;
1260 const uint8_t bit54 = (imm64 >> 52) & 0x3;
1261 const uint8_t bit30 = (imm64 >> 48) & 0xf;
1262 const uint8_t imm8 = (bit7 << 7) | (bit6 << 6) | (bit54 << 4) | bit30;
1264 if (imm64 != expimm8) {
1267 EmitFPImm(
FMOVDI, vd, imm8);
1375 EmitFPTwoSourceOp(
FMULD, vd, vn, vm);
1378 EmitFPTwoSourceOp(
FDIVD, vd, vn, vm);
1381 EmitFPTwoSourceOp(
FADDD, vd, vn, vm);
1384 EmitFPTwoSourceOp(
FSUBD, vd, vn, vm);
1389 EmitSIMDThreeSameOp(
VAND, vd, vn, vm);
1392 EmitSIMDThreeSameOp(
VORR, vd, vn, vm);
1395 EmitSIMDThreeSameOp(
VEOR, vd, vn, vm);
1398 EmitSIMDThreeSameOp(
VADDW, vd, vn, vm);
1401 EmitSIMDThreeSameOp(
VADDX, vd, vn, vm);
1404 EmitSIMDThreeSameOp(
VSUBW, vd, vn, vm);
1407 EmitSIMDThreeSameOp(
VSUBX, vd, vn, vm);
1410 EmitSIMDThreeSameOp(
VADDS, vd, vn, vm);
1413 EmitSIMDThreeSameOp(
VADDD, vd, vn, vm);
1416 EmitSIMDThreeSameOp(
VSUBS, vd, vn, vm);
1419 EmitSIMDThreeSameOp(
VSUBD, vd, vn, vm);
1422 EmitSIMDThreeSameOp(
VMULS, vd, vn, vm);
1425 EmitSIMDThreeSameOp(
VMULD, vd, vn, vm);
1428 EmitSIMDThreeSameOp(
VDIVS, vd, vn, vm);
1431 EmitSIMDThreeSameOp(
VDIVD, vd, vn, vm);
1434 EmitSIMDThreeSameOp(
VCEQS, vd, vn, vm);
1437 EmitSIMDThreeSameOp(
VCEQD, vd, vn, vm);
1440 EmitSIMDThreeSameOp(
VCGTS, vd, vn, vm);
1443 EmitSIMDThreeSameOp(
VCGTD, vd, vn, vm);
1446 EmitSIMDThreeSameOp(
VCGES, vd, vn, vm);
1449 EmitSIMDThreeSameOp(
VCGED, vd, vn, vm);
1452 EmitSIMDThreeSameOp(
VMINS, vd, vn, vm);
1455 EmitSIMDThreeSameOp(
VMIND, vd, vn, vm);
1458 EmitSIMDThreeSameOp(
VMAXS, vd, vn, vm);
1461 EmitSIMDThreeSameOp(
VMAXD, vd, vn, vm);
1464 EmitSIMDThreeSameOp(
VRECPSS, vd, vn, vm);
1467 EmitSIMDThreeSameOp(
VRSQRTSS, vd, vn, vm);
1477 EmitSIMDTwoRegOp(
VRECPES, vd, vn);
1480 EmitSIMDTwoRegOp(
VRSQRTES, vd, vn);
1491 EmitSIMDCopyOp(
VDUP, vd, vn,
kSWord, 0, idx);
1494 EmitSIMDCopyOp(
VDUP, vd, vn,
kDWord, 0, idx);
1505 EmitSIMDCopyOp(
VINS, vd, vn,
kSWord, sidx, didx);
1508 EmitSIMDCopyOp(
VINS, vd, vn,
kDWord, sidx, didx);
1521 if ((rd ==
CSP) || (rn ==
CSP)) {
1528 if ((rd ==
CSP) || (rn ==
CSP)) {
1623 const int32_t reg_size =
1625 ASSERT((shift >= 0) && (shift < reg_size));
1626 ubfm(rd, rn, (reg_size - shift) % reg_size, reg_size - shift - 1, sz);
1638 const int reg_size =
1640 ASSERT((shift >= 0) && (shift < reg_size));
1641 ubfm(rd, rn, shift, reg_size - 1, sz);
1650 const int reg_size =
1652 ASSERT((shift >= 0) && (shift < reg_size));
1653 sbfm(rd, rn, shift, reg_size - 1, sz);
1674#if defined(DART_COMPRESSED_POINTERS)
1745 const Object& equivalence,
1791 int32_t disp)
override {
1868 int32_t payload_offset,
1875#if defined(DART_COMPRESSED_POINTERS)
1945#if defined(DART_COMPRESSED_POINTERS)
1978 compiler::LRState
lr_state()
const {
return lr_state_; }
2053 bool can_be_null =
false)
override;
2084 bool enter_safepoint);
2086 bool exit_safepoint,
2087 bool ignore_unwind_in_progress =
false,
2088 bool set_tag =
true);
2142 intptr_t instance_size,
2149 intptr_t instance_size,
2162 Stop(
"Allocation canary");
2207 intptr_t index_scale);
2211 intptr_t index_scale,
2213 intptr_t index)
const;
2217 intptr_t index_scale,
2222 intptr_t index_scale,
2234 intptr_t index_scale,
2243 intptr_t index_scale,
2253#if defined(DART_COMPRESSED_POINTERS)
2257 Register offset_in_words_as_smi)
override;
2262 Register offset_in_words_as_smi)
override;
2266 int32_t
offset)
override {
2279 const int32_t imm32 =
static_cast<int32_t
>(imm);
2286 return static_cast<int64_t
>(off);
2290 bool use_far_branches_;
2292 bool constant_pool_allowed_;
2294 compiler::LRState lr_state_ = compiler::LRState::OnEntry();
2313 EmitAddSubShiftExtOp(
subtract ?
SUB :
ADD, crd, crn, o, os, set_flags);
2317 EmitAddSubShiftExtOp(
subtract ?
SUB :
ADD, crd, crn, o, os, set_flags);
2330 const int32_t
s = set_flags ?
B29 : 0;
2346 const int32_t
s = set_flags ?
B29 : 0;
2362 ASSERT(r_imm < 32 && s_imm < 32);
2364 ASSERT(r_imm < 64 && s_imm < 64);
2367 const int32_t encoding = instr | Operand(0, s_imm, r_imm).encoding() |
2385 const int32_t encoding =
2401 const int32_t encoding =
2415 const int32_t
s = set_flags ?
B29 : 0;
2421 int32_t BindImm26Branch(int64_t position, int64_t
dest);
2422 int32_t BindImm19Branch(int64_t position, int64_t
dest);
2423 int32_t BindImm14Branch(int64_t position, int64_t
dest);
2425 int32_t EncodeImm19BranchOffset(int64_t imm, int32_t instr) {
2426 if (!CanEncodeImm19BranchOffset(imm)) {
2430 const int32_t imm32 =
static_cast<int32_t
>(imm);
2436 int64_t DecodeImm19BranchOffset(int32_t instr) {
2438 const int32_t off =
static_cast<int32_t
>(insns << 13) >> 11;
2439 return static_cast<int64_t
>(off);
2442 int32_t EncodeImm14BranchOffset(int64_t imm, int32_t instr) {
2443 if (!CanEncodeImm14BranchOffset(imm)) {
2447 const int32_t imm32 =
static_cast<int32_t
>(imm);
2453 int64_t DecodeImm14BranchOffset(int32_t instr) {
2455 const int32_t off =
static_cast<int32_t
>(insns << 18) >> 16;
2456 return static_cast<int64_t
>(off);
2459 bool IsUnconditionalBranch(int32_t instr) {
2464 bool IsConditionalBranch(int32_t instr) {
2469 bool IsCompareAndBranch(int32_t instr) {
2474 bool IsTestAndBranch(int32_t instr) {
2479 Condition DecodeImm19BranchCondition(int32_t instr) {
2480 if (IsConditionalBranch(instr)) {
2483 ASSERT(IsCompareAndBranch(instr));
2484 return (instr &
B24) ?
EQ :
NE;
2487 int32_t EncodeImm19BranchCondition(
Condition cond, int32_t instr) {
2488 if (IsConditionalBranch(instr)) {
2489 const int32_t c_imm =
static_cast<int32_t
>(cond);
2492 ASSERT(IsCompareAndBranch(instr));
2493 return (instr & ~
B24) | (cond ==
EQ ?
B24 : 0);
2496 Condition DecodeImm14BranchCondition(int32_t instr) {
2497 ASSERT(IsTestAndBranch(instr));
2498 return (instr &
B24) ?
EQ :
NE;
2501 int32_t EncodeImm14BranchCondition(
Condition cond, int32_t instr) {
2502 ASSERT(IsTestAndBranch(instr));
2503 return (instr & ~
B24) | (cond ==
EQ ?
B24 : 0);
2512 const int32_t encoded_offset = EncodeImm19BranchOffset(imm, 0);
2524 intptr_t bit_number,
2528 const int32_t encoded_offset = EncodeImm14BranchOffset(imm, 0);
2529 ASSERT((bit_number >= 0) && (bit_number <= 63));
2533 int32_t bit_number_low = bit_number & 0x1f;
2534 int32_t bit_number_hi = (bit_number & 0x20) >> 5;
2535 const int32_t encoding =
2536 op | (bit_number_low << 19) | (bit_number_hi << 31) |
2537 (
static_cast<int32_t
>(crt) <<
kRtShift) | encoded_offset;
2545 const int32_t off = EncodeImm19BranchOffset(imm, 0);
2546 const int32_t encoding =
2547 op | (
static_cast<int32_t
>(cond) <<
kCondShift) | off;
2551 bool CanEncodeImm19BranchOffset(int64_t
offset) {
2556 bool CanEncodeImm14BranchOffset(int64_t
offset) {
2565 if (label->IsBound()) {
2575 EmitConditionalBranchOp(op, cond,
dest);
2586 b(label->position_);
2588 EmitConditionalBranchOp(op, cond, label->position_);
2590 label->LinkTo(position,
lr_state());
2598 if (label->IsBound()) {
2601 EmitCompareAndBranchOp(op ==
CBZ ?
CBNZ :
CBZ, rt,
2608 EmitCompareAndBranchOp(op, rt,
dest, sz);
2614 EmitCompareAndBranchOp(op ==
CBZ ?
CBNZ :
CBZ, rt,
2616 b(label->position_);
2618 EmitCompareAndBranchOp(op, rt, label->position_, sz);
2620 label->LinkTo(position,
lr_state());
2626 intptr_t bit_number,
2628 if (label->IsBound()) {
2631 EmitTestAndBranchOp(op ==
TBZ ?
TBNZ :
TBZ, rt, bit_number,
2638 EmitTestAndBranchOp(op, rt, bit_number,
dest);
2644 EmitTestAndBranchOp(op ==
TBZ ?
TBNZ :
TBZ, rt, bit_number,
2646 b(label->position_);
2648 EmitTestAndBranchOp(op, rt, bit_number, label->position_);
2650 label->LinkTo(position,
lr_state());
2654 bool CanEncodeImm26BranchOffset(int64_t
offset) {
2662 const int32_t encoding = op | off;
2667 if (label->IsBound()) {
2669 EmitUnconditionalBranchOp(op,
dest);
2673 EmitUnconditionalBranchOp(op, label->position_);
2674 label->LinkTo(position,
lr_state());
2684 static int32_t ExceptionGenOpEncoding(
ExceptionGenOp op, uint16_t imm) {
2685 return op | (
static_cast<int32_t
>(imm) <<
kImm16Shift);
2689 Emit(ExceptionGenOpEncoding(op, imm));
2694 const Immediate& imm,
2697 ASSERT((hw_idx >= 0) && (hw_idx <= 3));
2701 const int32_t encoding =
2703 (
static_cast<int32_t
>(hw_idx) <<
kHWShift) |
2704 (
static_cast<int32_t
>(imm.value() & 0xffff) <<
kImm16Shift);
2751 const int32_t encoding =
2774 ASSERT(
a.can_writeback_to(rt) &&
a.can_writeback_to(rt2));
2787 opc = op ==
LDP ?
B30 : 0;
2796 const int32_t encoding =
2823 const int32_t encoding =
2832 const int32_t loimm = (imm.value() & 0x3) << 29;
2833 const int32_t hiimm =
2847 const int32_t encoding =
2899 const int32_t encoding =
2910 const int32_t encoding =
2916 const int32_t encoding = op | (
static_cast<int32_t
>(vd) <<
kVdShift) |
2917 (
static_cast<int32_t
>(vn) <<
kVnShift);
2925 const int32_t encoding = op | (
static_cast<int32_t
>(vd) <<
kVdShift) |
2926 (
static_cast<int32_t
>(vn) <<
kVnShift) |
2927 (
static_cast<int32_t
>(vm) <<
kVmShift);
2932 const int32_t encoding = op | (
static_cast<int32_t
>(vn) <<
kVnShift) |
2933 (
static_cast<int32_t
>(vm) <<
kVmShift);
2941 const int32_t encoding = op | (
static_cast<int32_t
>(vd) <<
kVdShift) |
2942 (
static_cast<int32_t
>(vn) <<
kVnShift) |
2943 (
static_cast<int32_t
>(vm) <<
kVmShift);
2954 const int32_t imm5 = ((idx5 << (shift + 1)) | (1 << shift)) & 0x1f;
2955 const int32_t imm4 = (idx4 << shift) & 0xf;
2957 (
static_cast<int32_t
>(vd) <<
kVdShift) |
2958 (
static_cast<int32_t
>(vn) <<
kVnShift);
2963 const int32_t encoding = op | (
static_cast<int32_t
>(vd) <<
kVdShift) |
2964 (
static_cast<int32_t
>(vn) <<
kVnShift);
2974 DISALLOW_ALLOCATION();
static void done(const char *config, const char *src, const char *srcOptions, const char *name)
static uint32_t hash(const SkShaderBase::GradientInfo &v)
bool equals(SkDrawable *a, SkDrawable *b)
static bool subtract(const R &a, const R &b, R *out)
static int64_t VFPExpandImm(uint8_t imm8)
static constexpr int32_t kNopInstruction
static bool IsInt(intptr_t N, T value)
static constexpr int ShiftForPowerOfTwo(T x)
static T Minimum(T x, T y)
static bool IsUint(intptr_t N, T value)
static constexpr bool IsAligned(T x, uintptr_t alignment, uintptr_t offset=0)
static constexpr bool IsPowerOfTwo(T x)
Address & operator=(const Address &other)
static OperandSize OperandSizeFor(intptr_t cid)
static Address PC(int32_t pc_off)
static bool CanHoldOffset(int32_t offset, AddressType at=Offset, OperandSize sz=kEightBytes)
Address(Register rn, int32_t offset=0, AddressType at=Offset)
static Address PC(Register r)=delete
bool can_writeback_to(Register r) const
Address(Register rn, Register offset, AddressType at)=delete
static Address Pair(Register rn, int32_t offset=0, AddressType at=PairOffset)
Address(Register rn, Register rm, Extend ext=UXTX, Scaling scale=Unscaled)
Address(const Address &other)
static uint32_t Rm(Register rm)
static uint32_t Rt2(Register rt2)
static uint32_t Rs(Register rs)
static uint32_t Rn(Register rn)
static uint32_t Ra(Register ra)
static uint32_t Rt(Register rt)
static uint32_t Rd(Register rd)
intptr_t CodeSize() const
void Stop(const char *message)
void LoadCompressed(Register dst, const Address &address)
void LoadCompressedFieldFromOffset(Register dst, Register base, int32_t offset)
ObjectPoolBuilder & object_pool_builder()
void LoadCompressedFieldAddressForRegOffset(Register address, Register instance, Register offset_in_words_as_smi)
void LoadIndexedCompressed(Register dst, Register base, int32_t offset, Register index)
void LoadAcquireCompressed(Register dst, const Address &address)
void VRSqrts(VRegister vd, VRegister vn)
void AndImmediate(Register rd, int64_t imm) override
void PushRegistersInOrder(std::initializer_list< Register > regs)
void cinv(Register rd, Register rn, Condition cond)
void PopRegisterPair(Register r0, Register r1)
void umulh(Register rd, Register rn, Register rm, OperandSize sz=kEightBytes)
void MoveUnboxedDouble(FpuRegister dst, FpuRegister src)
void TestImmediate(Register rn, int64_t imm, OperandSize sz=kEightBytes)
void LoadClassId(Register result, Register object)
void RestoreCodePointer()
void LoadSFromOffset(VRegister dest, Register base, int32_t offset)
void LoadPoolPointer(Register pp=PP)
void LoadIndexedPayload(Register dest, Register base, int32_t payload_offset, Register index, ScaleFactor scale, OperandSize sz=kEightBytes) override
void cinc(Register rd, Register rn, Condition cond)
void Call(Address target)
void vdupx(VRegister vd, Register rn)
bool CanLoadFromObjectPool(const Object &object) const
void CompareClassId(Register object, intptr_t class_id, Register scratch=kNoRegister)
void vadds(VRegister vd, VRegister vn, VRegister vm)
void adcsw(Register rd, Register rn, Register rm)
void movz(Register rd, const Immediate &imm, int hw_idx)
void eor(Register rd, Register rn, Operand o, Condition cond=AL)
void PushRegisters(const RegisterSet ®isters)
void ExtendAndSmiTagValue(Register rd, Register rn, OperandSize sz=kEightBytes) override
void fcvtzsxd(Register rd, VRegister vn)
void StoreUnboxedDouble(FpuRegister src, Register base, int32_t offset)
void CompareObject(Register reg, const Object &object)
void vaddw(VRegister vd, VRegister vn, VRegister vm)
void fstp(VRegister rt, VRegister rt2, Address a, OperandSize sz)
void MoveUnboxedSimd128(FpuRegister dst, FpuRegister src)
void vrecpss(VRegister vd, VRegister vn, VRegister vm)
void BranchIfZero(Register rn, Label *label, JumpDistance distance=kFarJump)
void fcmpd(VRegister vn, VRegister vm)
void vsqrtd(VRegister vd, VRegister vn)
void CompareImmediate(Register rn, int64_t imm, OperandSize sz=kEightBytes) override
void tbz(Label *label, Register rt, intptr_t bit_number)
void LoadObject(Register dst, const Object &obj)
void PopDouble(VRegister reg)
void fmovrd(Register rd, VRegister vn)
void PushQuadPair(VRegister low, VRegister high)
void orr(Register rd, Register rn, Operand o, Condition cond=AL)
void MonomorphicCheckedEntryJIT()
void BranchIfSmi(Register reg, Label *label, JumpDistance distance=kFarJump) override
void sbcsw(Register rd, Register rn, Register rm)
void LoadTaggedClassIdMayBeSmi(Register result, Register object)
void Call(const Code &code)
void BranchLink(const Code &code, ObjectPoolBuilderEntry::Patchability patchable=ObjectPoolBuilderEntry::kNotPatchable, CodeEntryKind entry_kind=CodeEntryKind::kNormal, ObjectPoolBuilderEntry::SnapshotBehavior snapshot_behavior=ObjectPoolBuilderEntry::kSnapshotable)
void subsw(Register rd, Register rn, Operand o)
void RestorePinnedRegisters()
void fldrs(VRegister vt, Address a)
void fldrq(VRegister vt, Address a)
void LoadDFromOffset(DRegister reg, Register base, int32_t offset, Condition cond=AL)
void TransitionNativeToGenerated(Register scratch, bool exit_safepoint, bool ignore_unwind_in_progress=false, bool set_tag=true)
void TsanLoadAcquire(Register addr)
void ldr(Register rd, Address ad, Condition cond=AL)
void FinalizeHashForSize(intptr_t bit_size, Register hash, Register scratch=TMP) override
void Load(Register reg, const Address &address, OperandSize type, Condition cond)
void LoadDFromOffset(VRegister dest, Register base, int32_t offset)
void ComputeElementAddressForIntIndex(Register address, bool is_external, intptr_t cid, intptr_t index_scale, Register array, intptr_t index)
void PushRegisterPair(Register r0, Register r1)
void LoadDFieldFromOffset(VRegister dest, Register base, int32_t offset)
void StoreZero(const Address &address, Register temp=kNoRegister)
Address ElementAddressForRegIndex(bool is_external, intptr_t cid, intptr_t index_scale, bool index_unboxed, Register array, Register index, Register temp)
void fmovrs(Register rd, VRegister vn)
void EmitEntryFrameVerification()
Assembler(ObjectPoolBuilder *object_pool_builder, intptr_t far_branch_level=0)
void vsqrts(VRegister vd, VRegister vn)
void fcvtmswd(Register rd, VRegister vn)
void subs(Register rd, Register rn, Operand o, OperandSize sz=kEightBytes)
void XorImmediate(Register rd, Register rn, int64_t imm, OperandSize sz=kEightBytes)
void andw_(Register rd, Register rn, Operand o)
void vcgtd(VRegister vd, VRegister vn, VRegister vm)
void EnterFrame(intptr_t frame_size)
void fmovdr(VRegister vd, Register rn)
void vorr(VRegister vd, VRegister vn, VRegister vm)
void fmovdd(VRegister vd, VRegister vn)
void LoadFieldFromOffset(Register reg, Register base, int32_t offset, OperandSize type=kFourBytes) override
void vdupw(VRegister vd, Register rn)
void CheckAllocationCanary(Register top, Register tmp=TMP)
void StoreSToOffset(VRegister src, Register base, int32_t offset)
void ldr(Register rt, Address a, OperandSize sz=kEightBytes)
void AddImmediate(Register dest, Register rn, int64_t imm, OperandSize sz=kEightBytes)
void SmiUntag(Register reg)
void LoadQFieldFromOffset(VRegister dest, Register base, int32_t offset)
void sxth(Register rd, Register rn)
void ubfm(Register rd, Register rn, int r_imm, int s_imm, OperandSize size=kEightBytes)
void lslvw(Register rd, Register rn, Register rm)
void LoadSImmediate(VRegister reg, float immd)
void Jump(Label *label, JumpDistance distance=kFarJump)
void StoreWordToPoolIndex(Register src, intptr_t index, Register pp=PP)
void CompareObjectRegisters(Register rn, Register rm)
void LoadAcquire(Register dst, const Address &address, OperandSize size=kFourBytes) override
void msub(Register rd, Register rn, Register rm, Register ra, OperandSize sz=kEightBytes)
void Pop(Register rd, Condition cond=AL)
void andis(Register rd, Register rn, const Immediate &imm, OperandSize sz=kEightBytes)
void StoreObjectIntoObjectNoBarrier(Register object, const Address &address, const Object &value, MemoryOrder memory_order=kRelaxedNonAtomic, OperandSize size=kWordBytes) override
void LoadFromStack(Register dst, intptr_t depth)
void bfm(Register rd, Register rn, int r_imm, int s_imm, OperandSize size=kEightBytes)
void vrecpes(VRegister vd, VRegister vn)
void EnterOsrFrame(intptr_t extra_size, Register new_pp=kNoRegister)
Address ElementAddressForIntIndex(bool is_external, intptr_t cid, intptr_t index_scale, Register array, intptr_t index) const
void cmn(Register rn, Operand o, OperandSize sz=kEightBytes)
void umaddl(Register rd, Register rn, Register rm, Register ra, OperandSize sz=kEightBytes)
void stlr(Register rt, Register rn, OperandSize sz=kEightBytes)
void PushRegister(Register r)
void fcvtzswd(Register rd, VRegister vn)
void LoadMemoryValue(Register dst, Register base, int32_t offset)
void MulImmediate(Register reg, int64_t imm, OperandSize width=kEightBytes) override
void b(Label *label, Condition cond=AL)
void orr(Register rd, Register rn, Operand o, OperandSize sz=kEightBytes)
void set_lr_state(compiler::LRState state)
void subw(Register rd, Register rn, Operand o)
void set_constant_pool_allowed(bool b)
void Align(intptr_t alignment, intptr_t offset)
void vmind(VRegister vd, VRegister vn, VRegister vm)
void sub(Register rd, Register rn, Operand o, OperandSize sz=kEightBytes)
void PopDoublePair(VRegister low, VRegister high)
void LslImmediate(Register rd, Register rn, int32_t shift)
void fsqrtd(VRegister vd, VRegister vn)
void PopFloat(VRegister reg)
void stp(Register rt, Register rt2, Address a, OperandSize sz=kEightBytes)
Address PrepareLargeOffset(Register base, int32_t offset, OperandSize sz, Address::AddressType addr_type)
static bool AddressCanHoldConstantIndex(const Object &constant, bool is_external, intptr_t cid, intptr_t index_scale)
void EnterDartFrame(intptr_t frame_size, Register new_pp=kNoRegister)
void EnterFullSafepoint(Register scratch)
void vsubs(VRegister vd, VRegister vn, VRegister vm)
void LoadClassById(Register result, Register class_id)
void sxtb(Register rd, Register rn)
void and_(Register rd, Register rn, Operand o, OperandSize sz=kEightBytes)
void vabss(VRegister vd, VRegister vn)
void BranchLinkWithEquivalence(const Code &code, const Object &equivalence, CodeEntryKind entry_kind=CodeEntryKind::kNormal)
void smull(Register rd, Register rn, Register rm, OperandSize sz=kEightBytes)
void vmov(VRegister vd, VRegister vn)
void PushValueAtOffset(Register base, int32_t offset)
void adds(Register rd, Register rn, Operand o, Condition cond=AL)
void LoadIsolate(Register dst)
void SetupDartSP(intptr_t reserve=4096)
void fcvtds(VRegister vd, VRegister vn)
void cmpw(Register rn, Operand o)
void smulh(Register rd, Register rn, Register rm, OperandSize sz=kEightBytes)
void tbnz(Label *label, Register rt, intptr_t bit_number)
void vrsqrtss(VRegister vd, VRegister vn, VRegister vm)
void vabsd(VRegister vd, VRegister vn)
void fstrd(VRegister vt, Address a)
void udiv(Register rd, Register rn, Register rm, OperandSize sz=kEightBytes)
void mulw(Register rd, Register rn, Register rm)
void sbcw(Register rd, Register rn, Register rm)
void Push(Register rd, Condition cond=AL)
void SetupCSPFromThread(Register thr)
void orri(Register rd, Register rn, const Immediate &imm, OperandSize sz=kEightBytes)
void LsrImmediate(Register rd, int32_t shift) override
void str(Register rd, Address ad, Condition cond=AL)
void adds(Register rd, Register rn, Operand o, OperandSize sz=kEightBytes)
void SetReturnAddress(Register value)
void sbfx(Register rd, Register rn, int low_bit, int width, OperandSize size=kEightBytes)
void SubImmediateSetFlags(Register dest, Register rn, int64_t imm, OperandSize sz=kEightBytes)
void GenerateUnRelocatedPcRelativeCall(intptr_t offset_into_target=0)
void LsrImmediate(Register rd, Register rn, int shift, OperandSize sz=kEightBytes)
void fcvtpsxd(Register rd, VRegister vn)
void madd(Register rd, Register rn, Register rm, Register ra, OperandSize sz=kEightBytes)
void PopQuad(VRegister reg)
void LoadInt32FromBoxOrSmi(Register result, Register value) override
void adc(Register rd, Register rn, Register rm)
void BranchIf(Condition condition, Label *label, JumpDistance distance=kFarJump)
void fcvtpswd(Register rd, VRegister vn)
void fmuld(VRegister vd, VRegister vn, VRegister vm)
void PushObject(const Object &object)
void adcw(Register rd, Register rn, Register rm)
void ComputeElementAddressForRegIndex(Register address, bool is_external, intptr_t cid, intptr_t index_scale, bool index_unboxed, Register array, Register index)
void AndRegisters(Register dst, Register src1, Register src2=kNoRegister) override
void PushImmediate(int64_t immediate)
void TryAllocateObject(intptr_t cid, intptr_t instance_size, Label *failure, JumpDistance distance, Register instance_reg, Register top_reg) override
void stxr(Register rs, Register rt, Register rn, OperandSize size=kEightBytes)
void andi(Register rd, Register rn, const Immediate &imm, OperandSize sz=kEightBytes)
void fcvtsd(VRegister vd, VRegister vn)
void LsrImmediate(Register rd, Register rn, int32_t shift)
void fabsd(VRegister vd, VRegister vn)
void OrImmediate(Register rd, Register rn, int64_t imm, OperandSize sz=kEightBytes)
void PushPair(Register low, Register high)
void vand(VRegister vd, VRegister vn, VRegister vm)
void cmp(Register rn, Operand o, Condition cond=AL)
void LoadWordFromPoolIndex(Register dst, intptr_t index, Register pp=PP)
void StoreDFieldToOffset(VRegister src, Register base, int32_t offset)
void LoadUnboxedSimd128(FpuRegister dst, Register base, int32_t offset)
void LoadUniqueObject(Register dst, const Object &obj)
void StoreMemoryValue(Register src, Register base, int32_t offset)
void TransitionGeneratedToNative(Register destination_address, Register new_exit_frame, Register new_exit_through_ffi, bool enter_safepoint)
void tst(Register rn, Operand o, OperandSize sz=kEightBytes)
void ldxr(Register rt, Register rn, OperandSize size=kEightBytes)
void vdups(VRegister vd, VRegister vn, int32_t idx)
void Load(Register dest, const Address &address, OperandSize sz=kEightBytes) override
void GenerateCbzTbz(Register rn, Condition cond, Label *label, OperandSize sz=kEightBytes)
void vnot(VRegister vd, VRegister vn)
void asrvw(Register rd, Register rn, Register rm)
void StoreToStack(Register src, intptr_t depth)
void vdivs(VRegister vd, VRegister vn, VRegister vm)
void rbit(Register rd, Register rn)
void csetm(Register rd, Condition cond)
void AddScaled(Register dest, Register base, Register index, ScaleFactor scale, int32_t disp) override
void vcged(VRegister vd, VRegister vn, VRegister vm)
void sxtw(Register rd, Register rn)
void cbnz(Label *label, Register rt, OperandSize sz=kEightBytes)
void set_use_far_branches(bool b)
void vcges(VRegister vd, VRegister vn, VRegister vm)
void LoadStaticFieldAddress(Register address, Register field, Register scratch, bool is_shared)
void SubRegisters(Register dest, Register src)
void vrsqrtes(VRegister vd, VRegister vn)
void clz(Register rd, Register rn)
void PopRegisters(const RegisterSet ®isters)
void StoreInternalPointer(Register object, const Address &dest, Register value)
void tsti(Register rn, const Immediate &imm, OperandSize sz=kEightBytes)
void AddRegisters(Register dest, Register src)
void Emit64(int64_t value)
void fdivd(VRegister vd, VRegister vn, VRegister vm)
void cbz(Label *label, Register rt, OperandSize sz=kEightBytes)
void LslImmediate(Register rd, int32_t shift, OperandSize sz=kEightBytes)
void Bind(Label *label) override
void ReserveAlignedFrameSpace(intptr_t frame_space)
void csinv(Register rd, Register rn, Register rm, Condition cond)
void vaddd(VRegister vd, VRegister vn, VRegister vm)
static int64_t DecodeImm26BranchOffset(int32_t instr)
static intptr_t EntryPointToPcMarkerOffset()
void vceqd(VRegister vd, VRegister vn, VRegister vm)
void add(Register rd, Register rn, Operand o, OperandSize sz=kEightBytes)
void vsubd(VRegister vd, VRegister vn, VRegister vm)
void OrImmediate(Register rd, int64_t imm)
void MonomorphicCheckedEntryAOT()
void addsw(Register rd, Register rn, Operand o)
bool use_far_branches() const
void RangeCheck(Register value, Register temp, intptr_t low, intptr_t high, RangeCheckCondition condition, Label *target) override
void AddImmediate(Register dest, int64_t imm)
void PopPair(Register low, Register high)
void TagAndPushPPAndPcMarker()
void cmp(Register rn, Operand o, OperandSize sz=kEightBytes)
bool constant_pool_allowed() const
void PopRegister(Register r)
void bics(Register rd, Register rn, Operand o, OperandSize sz=kEightBytes)
void movk(Register rd, const Immediate &imm, int hw_idx)
void SmiTagAndBranchIfOverflow(Register reg, Label *label)
void ldp(Register rt, Register rt2, Address a, OperandSize sz=kEightBytes)
void vinsd(VRegister vd, int32_t didx, VRegister vn, int32_t sidx)
void LslRegister(Register dst, Register shift) override
void LoadImmediate(Register reg, int64_t imm) override
void add(Register rd, Register rn, Operand o, Condition cond=AL)
void vmins(VRegister vd, VRegister vn, VRegister vm)
void uxth(Register rd, Register rn)
void sbfiz(Register rd, Register rn, int low_bit, int width, OperandSize size=kEightBytes)
void mov(Register rd, Register rn)
void lsrvw(Register rd, Register rn, Register rm)
void vcgts(VRegister vd, VRegister vn, VRegister vm)
void mul(Register rd, Register rn, Register rm, Condition cond=AL)
void umull(Register rd, Register rn, Register rm, OperandSize sz=kEightBytes)
void Call(Address target, Condition cond=AL)
void CallCFunction(Register target)
void WriteAllocationCanary(Register top)
void vmuld(VRegister vd, VRegister vn, VRegister vm)
void sdivw(Register rd, Register rn, Register rm)
void vmaxd(VRegister vd, VRegister vn, VRegister vm)
void ret(Register rn=kNoRegister2)
void CallRuntime(const RuntimeEntry &entry, intptr_t argument_count)
void ExtractInstanceSizeFromTags(Register result, Register tags)
void LoadObject(Register rd, const Object &object, Condition cond=AL)
void CompareRegisters(Register rn, Register rm)
void mvnw(Register rd, Register rm)
void uxtw(Register rd, Register rn)
void ArrayStoreBarrier(Register object, Register slot, Register value, CanBeSmi can_value_be_smi, Register scratch) override
void negsw(Register rd, Register rm)
void vinsx(VRegister vd, int32_t didx, Register rn)
void CompareToStack(Register src, intptr_t depth)
void fstrs(VRegister vt, Address a)
void AddImmediateSetFlags(Register dest, Register rn, int64_t imm, OperandSize sz=kEightBytes)
void sbfx(Register rd, Register rn, int32_t lsb, int32_t width, Condition cond=AL)
void LoadImmediate(Register rd, Immediate value, Condition cond=AL)
void vsubw(VRegister vd, VRegister vn, VRegister vm)
void lsrv(Register rd, Register rn, Register rm, OperandSize sz=kEightBytes)
void ldclr(Register rs, Register rt, Register rn, OperandSize sz=kEightBytes)
void StoreQFieldToOffset(VRegister src, Register base, int32_t offset)
void AndImmediate(Register rd, Register rs, int32_t imm, Condition cond=AL)
void VRecps(VRegister vd, VRegister vn)
void mvn_(Register rd, Register rm)
void vdivd(VRegister vd, VRegister vn, VRegister vm)
void csinc(Register rd, Register rn, Register rm, Condition cond, OperandSize sz=kEightBytes)
void csel(Register rd, Register rn, Register rm, Condition cond)
void LoadFromOffset(Register reg, Register base, int32_t offset, OperandSize type=kFourBytes) override
void addw(Register rd, Register rn, Operand o)
void faddd(VRegister vd, VRegister vn, VRegister vm)
void PushNativeCalleeSavedRegisters()
void PushFloat(VRegister reg)
void bic(Register rd, Register rn, Operand o, OperandSize sz=kEightBytes)
void cset(Register rd, Condition cond)
void Jump(const Address &address)
void fmovsr(VRegister vd, Register rn)
void ExtendValue(Register rd, Register rn, OperandSize sz) override
void mul(Register rd, Register rn, Register rm)
void LoadDoubleWordFromPoolIndex(Register lower, Register upper, intptr_t index)
void smaddl(Register rd, Register rn, Register rm, Register ra, OperandSize sz=kEightBytes)
void vdupd(VRegister vd, VRegister vn, int32_t idx)
void StoreBarrier(Register object, Register value, CanBeSmi can_value_be_smi, Register scratch) override
void MaybeTraceAllocation(intptr_t cid, Label *trace, Register temp_reg, JumpDistance distance=JumpDistance::kFarJump)
void uxtb(Register rd, Register rn)
void ands(Register rd, Register rn, Operand o, OperandSize sz=kEightBytes)
void BranchLinkPatchable(const Code &code, CodeEntryKind entry_kind=CodeEntryKind::kNormal, ObjectPoolBuilderEntry::SnapshotBehavior snapshot_behavior=ObjectPoolBuilderEntry::kSnapshotable)
void vmovrs(Register rd, VRegister vn, int32_t sidx)
static bool IsSafeSmi(const Object &object)
void clzw(Register rd, Register rn)
void and_(Register rd, Register rn, Operand o, Condition cond=AL)
void PushDouble(VRegister reg)
static int32_t HeapDataOffset(bool is_external, intptr_t cid)
void LoadAcquire(Register dst, const Address &address, OperandSize size=kEightBytes) override
void asrv(Register rd, Register rn, Register rm, OperandSize sz=kEightBytes)
void Drop(intptr_t stack_elements)
void ubfiz(Register rd, Register rn, int low_bit, int width, OperandSize size=kEightBytes)
void StoreUnboxedSimd128(FpuRegister src, Register base, int32_t offset)
void vmuls(VRegister vd, VRegister vn, VRegister vm)
void csneg(Register rd, Register rn, Register rm, Condition cond)
void EnterCFrame(intptr_t frame_space)
void PushDoublePair(VRegister low, VRegister high)
void adr(Register rd, const Immediate &imm)
compiler::LRState lr_state() const
void negs(Register rd, Register rm, OperandSize sz=kEightBytes)
void CombineHashes(Register hash, Register other) override
void sdiv(Register rd, Register rn, Register rm, OperandSize sz=kEightBytes)
void scvtfdx(VRegister vd, Register rn)
void ands(Register rd, Register rn, Operand o, Condition cond=AL)
void LoadQFromOffset(VRegister dest, Register base, int32_t offset)
void VerifyStoreNeedsNoWriteBarrier(Register object, Register value) override
void sbfm(Register rd, Register rn, int r_imm, int s_imm, OperandSize size=kEightBytes)
void CompareWords(Register reg1, Register reg2, intptr_t offset, Register count, Register temp, Label *equals) override
void sbc(Register rd, Register rn, Register rm)
Address ElementAddressForRegIndexWithSize(bool is_external, intptr_t cid, OperandSize size, intptr_t index_scale, bool index_unboxed, Register array, Register index, Register temp)
void PushQuad(VRegister reg)
void movn(Register rd, const Immediate &imm, int hw_idx)
void StorePairToOffset(Register low, Register high, Register base, int32_t offset, OperandSize sz=kEightBytes)
void StoreRelease(Register src, const Address &address, OperandSize size=kEightBytes) override
void BranchIfNotSmi(Register reg, Label *label, JumpDistance distance=kFarJump)
void GenerateUnRelocatedPcRelativeTailCall(intptr_t offset_into_target=0)
void LoadInt64FromBoxOrSmi(Register result, Register value) override
void Store(Register src, const Address &address, OperandSize sz=kEightBytes) override
void CallCFunction(Address target)
void cneg(Register rd, Register rn, Condition cond)
void subs(Register rd, Register rn, Operand o, Condition cond=AL)
static bool IsSafe(const Object &object)
void BranchIfBit(Register rn, intptr_t bit_number, Condition condition, Label *label, JumpDistance distance=kFarJump)
void ldset(Register rs, Register rt, Register rn, OperandSize sz=kEightBytes)
void vmaxs(VRegister vd, VRegister vn, VRegister vm)
void StoreDToOffset(VRegister src, Register base, int32_t offset)
void Jump(Register target)
void scvtfdw(VRegister vd, Register rn)
void vnegd(VRegister vd, VRegister vn)
void sdiv(Register rd, Register rn, Register rm, Condition cond=AL)
void LoadClassIdMayBeSmi(Register result, Register object)
void ornw(Register rd, Register rn, Operand o)
void eor(Register rd, Register rn, Operand o, OperandSize sz=kEightBytes)
static int32_t EncodeImm26BranchOffset(int64_t imm, int32_t instr)
void fldrd(VRegister vt, Address a)
void ubfx(Register rd, Register rn, int low_bit, int width, OperandSize size=kEightBytes)
void vaddx(VRegister vd, VRegister vn, VRegister vm)
void PopQuadPair(VRegister low, VRegister high)
void LoadUnboxedDouble(FpuRegister dst, Register base, int32_t offset)
void vinsw(VRegister vd, int32_t didx, Register rn)
void vsubx(VRegister vd, VRegister vn, VRegister vm)
void LoadIsolateGroup(Register dst)
void fsubd(VRegister vd, VRegister vn, VRegister vm)
void LoadFieldAddressForRegOffset(Register address, Register instance, Register offset_in_words_as_smi) override
void eon(Register rd, Register rn, Operand o, OperandSize sz=kEightBytes)
void fnegd(VRegister vd, VRegister vn)
void vinss(VRegister vd, int32_t didx, VRegister vn, int32_t sidx)
void PopNativeCalleeSavedRegisters()
void orrw(Register rd, Register rn, Operand o)
void BranchOnMonomorphicCheckedEntryJIT(Label *label)
void Store(Register reg, const Address &address, OperandSize type, Condition cond)
void SmiUntag(Register reg, Condition cond=AL)
void MoveRegister(Register rd, Register rm, Condition cond)
void Breakpoint() override
void LoadQImmediate(VRegister reg, simd128_value_t immq)
void orn(Register rd, Register rn, Operand o, OperandSize sz=kEightBytes)
void fcvtmsxd(Register rd, VRegister vn)
void TsanStoreRelease(Register addr)
void eori(Register rd, Register rn, const Immediate &imm, OperandSize sz=kEightBytes)
void sub(Register rd, Register rn, Operand o, Condition cond=AL)
void movw(Register rd, Register rn)
void LoadFieldAddressForOffset(Register address, Register instance, int32_t offset) override
void neg(Register rd, Register rm)
void LoadDImmediate(VRegister reg, double immd)
void TryAllocateArray(intptr_t cid, intptr_t instance_size, Label *failure, Register instance, Register end_address, Register temp1, Register temp2)
void StoreToOffset(Register reg, Register base, int32_t offset, OperandSize type=kFourBytes) override
void AsrImmediate(Register rd, Register rn, int shift, OperandSize sz=kEightBytes)
void adcs(Register rd, Register rn, Register rm)
void ExtractClassIdFromTags(Register result, Register tags)
void vmovrd(Register rd, VRegister vn, int32_t sidx)
void MaybeTraceAllocation(Register cid, Label *trace, Register temp_reg, JumpDistance distance=JumpDistance::kFarJump)
void eorw(Register rd, Register rn, Operand o)
void SmiUntag(Register dst, Register src)
void EnsureHasClassIdInDEBUG(intptr_t cid, Register src, Register scratch, bool can_be_null=false) override
bool CanGenerateCbzTbz(Register rn, Condition cond)
void SmiTag(Register dst, Register src)
void fldp(VRegister rt, VRegister rt2, Address a, OperandSize sz)
void CompareWithMemoryValue(Register value, Address address, OperandSize sz=kEightBytes) override
void StoreDToOffset(DRegister reg, Register base, int32_t offset, Condition cond=AL)
void PushImmediate(Immediate immediate)
void ldar(Register rt, Register rn, OperandSize sz=kEightBytes)
void AddImmediate(Register rd, int32_t value, Condition cond=AL)
void AndImmediate(Register rd, Register rn, int64_t imm, OperandSize sz=kEightBytes)
void bfi(Register rd, Register rn, int low_bit, int width, OperandSize size=kEightBytes)
void lslv(Register rd, Register rn, Register rm, OperandSize sz=kEightBytes)
void ExitFullSafepoint(Register scratch, bool ignore_unwind_in_progress)
void str(Register rt, Address a, OperandSize sz=kEightBytes)
void LoadNativeEntry(Register dst, const ExternalLabel *label, ObjectPoolBuilderEntry::Patchability patchable)
void LslImmediate(Register rd, Register rn, int32_t shift, OperandSize sz=kEightBytes)
void CopyMemoryWords(Register src, Register dst, Register size, Register temp)
void StoreQToOffset(VRegister src, Register base, int32_t offset)
static constexpr intptr_t kEntryPointToPcMarkerOffset
void fstrq(VRegister vt, Address a)
bool fmovdi(VRegister vd, double immd)
void SetupGlobalPoolAndDispatchTable()
void SmiTag(Register reg) override
void fcmpdz(VRegister vn)
void LoadImmediate(Register reg, Immediate imm)
void veor(VRegister vd, VRegister vn, VRegister vm)
void vnegs(VRegister vd, VRegister vn)
void sbcs(Register rd, Register rn, Register rm)
void vceqs(VRegister vd, VRegister vn, VRegister vm)
void bfxil(Register rd, Register rn, int low_bit, int width, OperandSize size=kEightBytes)
void ArithmeticShiftRightImmediate(Register reg, intptr_t shift) override
FieldAddress & operator=(const FieldAddress &other)
FieldAddress(const FieldAddress &other)
FieldAddress(Register base, Register disp)=delete
FieldAddress(Register base, int32_t disp)
static bool CanHoldOffset(int32_t offset, AddressType at=Offset, OperandSize sz=kEightBytes)
intptr_t far_branch_level() const
Operand(Register rm, Shift shift, int32_t imm)
static bool IsImmLogical(uint64_t value, uint8_t width, Operand *imm_op)
Operand(Register rm, Shift shift, Register r)
Operand(const Operand &other)
Operand(Register rm, Extend extend, Register r)
Operand & operator=(const Operand &other)
Operand(uint8_t n, int8_t imm_s, int8_t imm_r)
static OperandType CanHold(int64_t imm, uint8_t sz, Operand *op)
Operand(Register rm, Extend extend, int32_t imm)
ScaleFactor scale() const
static word DataOffsetFor(intptr_t cid)
static word value_offset()
Dart_NativeFunction function
static constexpr intptr_t kWordSize
constexpr intptr_t kSmiBits
void BailoutWithBranchOffsetError()
static bool IsSignedOperand(OperandSize os)
static int Log2OperandSizeBytes(OperandSize os)
bool IsSameObject(const Object &a, const Object &b)
const Object & NullObject()
constexpr OperandSize kWordBytes
const int kXRegSizeInBits
@ TIMES_COMPRESSED_WORD_SIZE
static Condition InvertCondition(Condition c)
static constexpr intptr_t kAllocationCanary
Register ConcreteRegister(LinkRegister)
constexpr intptr_t kQuadSize
const int kWRegSizeInBits
constexpr intptr_t kFloatSize
constexpr intptr_t kDoubleSize
COMPILE_ASSERT(kUnreachableReference==WeakTable::kNoValue)
@ UnconditionalBranchMask
@ UnconditionalBranchFixed
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size