some questions about vm code implement

ziai li zli817357 at gmail.com
Fri Sep 16 02:45:51 UTC 2022


Hi all:

In the process of reading the code, I have some doubts about the
implementation of vm code
for example in cpu/aarch64/upcallLinker_aarch64.cpp

// for callee saved regs, according to the caller's ABI
static int compute_reg_save_area_size(const ABIDescriptor& abi) {

  for (int i = 0; i < FloatRegisterImpl::number_of_registers; i++) {
    FloatRegister reg = as_FloatRegister(i);
    if (!abi.is_volatile_reg(reg)) {
      // Only the lower 64 bits of vector registers need to be preserved.
      size += 8; // bytes
    }
  }
}

static void preserve_callee_saved_registers(MacroAssembler* _masm, const
ABIDescriptor& abi, int reg_save_area_offset) {

  for (int i = 0; i < FloatRegisterImpl::number_of_registers; i++) {
    FloatRegister reg = as_FloatRegister(i);
    if (!abi.is_volatile_reg(reg)) {
      __ strd(reg, Address(sp, offset));
      offset += 8;
    }
  }
}

static void restore_callee_saved_registers(MacroAssembler* _masm, const
ABIDescriptor& abi, int reg_save_area_offset) {

  for (int i = 0; i < FloatRegisterImpl::number_of_registers; i++) {
    FloatRegister reg = as_FloatRegister(i);
    if (!abi.is_volatile_reg(reg)) {
      __ ldrd(reg, Address(sp, offset));
      offset += 8;
    }
  }
}

In the comments of the function compute_reg_save_area_size, only the lower
64 bits of vector registers need to be preserved, so the size is set to
8. Is this due to the calling convention of aarch64 or is it because only
floating point data needs to be saved? I have the same question about the
restore_callee_saved_registers and preserve_callee_saved_registers
functions.
The x86 code is implemented like this:

static int compute_reg_save_area_size(const ABIDescriptor& abi) {

  for (XMMRegister reg = as_XMMRegister(0); is_valid_XMM(reg); reg =
reg->successor()) {
    if (!abi.is_volatile_reg(reg)) {
      if (UseAVX >= 3) {
        size += 64; // bytes
      } else if (UseAVX >= 1) {
        size += 32;
      } else {
        size += 16;
      }
    }
  }
}

So I don't know what principle the value of size is set according to, such
as riscv, what should the value of size be, 8 or 16 or what?

Looking forward to your reply

ziai li
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/panama-dev/attachments/20220916/4852332b/attachment.htm>


More information about the panama-dev mailing list