< prev index next >

src/cpu/aarch64/vm/macroAssembler_aarch64.cpp

Print this page
rev 8690 : 8131362: aarch64: C2 does not handle large stack offsets
Summary: change spill code to allow large offsets
Reviewed-by: duke

@@ -2304,10 +2304,32 @@
   } else {
     return Address(r, r1, ext);
   }
 }
 
+Address MacroAssembler::spill_address(int size, int offset)
+{
+  assert(offset >= 0, "spill to negative address?");
+  // Offset reachable ?
+  //   Not aligned - 9 bits signed offset
+  //   Aligned - 12 bits unsigned offset shifted
+  Register base = sp;
+  if ((offset & (size-1)) && offset >= (1<<8)) {
+    add(rscratch2, base, offset & ((1<<12)-1));
+    base = rscratch2;
+    offset &= ~((1<<12)-1);
+  }
+
+  if (offset >= (1<<12) * size) {
+    add(rscratch2, base, offset & (((1<<12)-1)<<12));
+    base = rscratch2;
+    offset &= ~(((1<<12)-1)<<12);
+  }
+
+  return Address(base, offset);
+}
+
 /**
  * Multiply 64 bit by 64 bit first loop.
  */
 void MacroAssembler::multiply_64_x_64_loop(Register x, Register xstart, Register x_xstart,
                                            Register y, Register y_idx, Register z,
< prev index next >