[aarch64-port-dev ] aarch64_get_thread_helper assumptions

Anton Kozlov akozlov at azul.com
Sun Jan 24 16:42:25 UTC 2021


Hi, Bernhard, Ludovic,

following Andrew's comment on https://github.com/openjdk/jdk/pull/2200#discussion_r563131940. Could you describe why there is no volatile registers saving on Windows? It's a usual C function that can clobber r0-r17, so shouldn't these be saved?

I would like make a change like below, or do I miss something?

Thanks,
Anton

--- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp
+++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp
@@ -5265,10 +5265,14 @@ void MacroAssembler::char_array_compress(Register src, Register dst, Register le
 // by the call to JavaThread::aarch64_get_thread_helper() or, indeed,
 // the call setup code.
 //
-// aarch64_get_thread_helper() clobbers only r0, r1, and flags.
+// On Linux, aarch64_get_thread_helper() clobbers only r0, r1, and flags.
+// On Windows and macOS, the helper is a usual C function.
 //
 void MacroAssembler::get_thread(Register dst) {
-  RegSet saved_regs = RegSet::range(r0, r1) + BSD_ONLY(RegSet::range(r2, r17)) + lr - dst;
+  RegSet saved_regs =
+    LINUX_ONLY(RegSet::range(r0, r1)  + lr - dst)
+    NOT_LINUX (RegSet::range(r0, r17) + lr - dst);
+
   push(saved_regs, sp);

   mov(lr, CAST_FROM_FN_PTR(address, JavaThread::aarch64_get_thread_helper));



More information about the aarch64-port-dev mailing list