class Arm64Assembler final : public Assembler { public: // `art_features` is optional and may be null.
Arm64Assembler(ArenaAllocator* allocator, const Arm64InstructionSetFeatures* art_features);
void SpillRegisters(vixl::aarch64::CPURegList registers, int offset); void UnspillRegisters(vixl::aarch64::CPURegList registers, int offset);
// A helper to save/restore a list of ZRegisters to a specified stack offset location. template <bool is_save> void SaveRestoreZRegisterList(uint32_t vreg_bit_vector, int64_t stack_offset) { if (vreg_bit_vector == 0) { return;
}
vixl::aarch64::UseScratchRegisterScope temps(GetVIXLAssembler());
vixl::aarch64::Register temp = temps.AcquireX();
vixl_masm_.Add(temp, vixl::aarch64::sp, stack_offset);
size_t slot_no = 0; for (uint32_t i : LowToHighBits(vreg_bit_vector)) { if (is_save) {
vixl_masm_.Str(vixl::aarch64::ZRegister(i),
vixl::aarch64::SVEMemOperand(temp, slot_no, vixl::aarch64::SVE_MUL_VL));
} else {
vixl_masm_.Ldr(vixl::aarch64::ZRegister(i),
vixl::aarch64::SVEMemOperand(temp, slot_no, vixl::aarch64::SVE_MUL_VL));
}
slot_no++;
}
}
// Jump to address (not setting link register) void JumpTo(ManagedRegister m_base, Offset offs, ManagedRegister m_scratch);
// // Heap poisoning. //
// Poison a heap reference contained in `reg`. void PoisonHeapReference(vixl::aarch64::Register reg); // Unpoison a heap reference contained in `reg`. void UnpoisonHeapReference(vixl::aarch64::Register reg); // Poison a heap reference contained in `reg` if heap poisoning is enabled. void MaybePoisonHeapReference(vixl::aarch64::Register reg); // Unpoison a heap reference contained in `reg` if heap poisoning is enabled. void MaybeUnpoisonHeapReference(vixl::aarch64::Register reg);
// Emit code checking the status of the Marking Register, and aborting // the program if MR does not match the value stored in the art::Thread // object. // // Argument `temp` is used as a temporary register to generate code. // Argument `code` is used to identify the different occurrences of // MaybeGenerateMarkingRegisterCheck and is passed to the BRK instruction. void GenerateMarkingRegisterCheck(vixl::aarch64::Register temp, int code = 0);
void Bind([[maybe_unused]] Label* label) override {
UNIMPLEMENTED(FATAL) << "Do not use Bind(Label*) for ARM64";
} void Jump([[maybe_unused]] Label* label) override {
UNIMPLEMENTED(FATAL) << "Do not use Jump(Label*) for ARM64";
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.