<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">Hi all:<div><br></div><div>In the process of reading the code, I have some doubts about the implementation of vm code<br></div><div>for example in cpu/aarch64/upcallLinker_aarch64.cpp</div><div><br></div><div><div>// for callee saved regs, according to the caller's ABI</div><div>static int compute_reg_save_area_size(const ABIDescriptor& abi) {</div><div><br></div><div>  for (int i = 0; i < FloatRegisterImpl::number_of_registers; i++) {</div><div>    FloatRegister reg = as_FloatRegister(i);</div><div>    if (!abi.is_volatile_reg(reg)) {</div><div>      // Only the lower 64 bits of vector registers need to be preserved.</div><div>      size += 8; // bytes</div><div>    }   </div><div>  }</div><div>}</div></div><div><br></div><div><div>static void preserve_callee_saved_registers(MacroAssembler* _masm, const ABIDescriptor& abi, int reg_save_area_offset) {</div><div><br></div><div>  for (int i = 0; i < FloatRegisterImpl::number_of_registers; i++) {</div><div>    FloatRegister reg = as_FloatRegister(i);</div><div>    if (!abi.is_volatile_reg(reg)) {</div><div>      __ strd(reg, Address(sp, offset));</div><div>      offset += 8;</div><div>    }</div><div>  }</div><div>}</div></div><div><br></div><div><div>static void restore_callee_saved_registers(MacroAssembler* _masm, const ABIDescriptor& abi, int reg_save_area_offset) {</div><div><br></div><div>  for (int i = 0; i < FloatRegisterImpl::number_of_registers; i++) {</div><div>    FloatRegister reg = as_FloatRegister(i);</div><div>    if (!abi.is_volatile_reg(reg)) {</div><div>      __ ldrd(reg, Address(sp, offset));</div><div>      offset += 8;</div><div>    }</div><div>  }</div><div>}</div></div><div><br></div><div>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. <br></div><div>The x86 code is implemented like this:<br></div><div><br></div><div><div>static int compute_reg_save_area_size(const ABIDescriptor& abi) {</div><div><br></div><div>  for (XMMRegister reg = as_XMMRegister(0); is_valid_XMM(reg); reg = reg->successor()) {</div><div>    if (!abi.is_volatile_reg(reg)) {</div><div>      if (UseAVX >= 3) {</div><div>        size += 64; // bytes</div><div>      } else if (UseAVX >= 1) {</div><div>        size += 32; </div><div>      } else {</div><div>        size += 16; </div><div>      }   </div><div>    }   </div><div>  }</div><div>}</div></div><div><br></div><div>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?<br></div><div><br></div><div>Looking forward to your reply<br></div><div><br></div><div>ziai li</div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div>