summaryrefslogtreecommitdiff
path: root/compiler/utils/arm64/assembler_arm64.h
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/utils/arm64/assembler_arm64.h')
-rw-r--r--compiler/utils/arm64/assembler_arm64.h23
1 files changed, 23 insertions, 0 deletions
diff --git a/compiler/utils/arm64/assembler_arm64.h b/compiler/utils/arm64/assembler_arm64.h
index 5442b6a980..b49a13a067 100644
--- a/compiler/utils/arm64/assembler_arm64.h
+++ b/compiler/utils/arm64/assembler_arm64.h
@@ -24,6 +24,7 @@
#include <android-base/logging.h>
#include "base/arena_containers.h"
+#include "base/bit_utils_iterator.h"
#include "base/macros.h"
#include "dwarf/register.h"
#include "offsets.h"
@@ -98,6 +99,28 @@ class Arm64Assembler final : public Assembler {
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);