[aarch64-port-dev ] RFR: Fix C2 failure with frame sizes larger than 520

Edward Nevill ed at camswl.com
Tue Jun 10 14:49:28 UTC 2014


Hi,

The following patch fixes a problem where C2 failed with a framesize larger than 520.

This is because it uses stp/ldp which have a 7 bit signed immediate field and are therefore limited to -512/+504 offset.

Regards,
Ed.

--- CUT HERE ---
# HG changeset patch
# User Edward Nevill edward.nevill at linaro.org
# Date 1402411393 -3600
#      Tue Jun 10 15:43:13 2014 +0100
# Node ID c34fe0f6a90b4950fa3660756e3a931af8b21227
# Parent  64d5cd5fb32ae9b8ba4248916618c4ceed2c004b
Fix C2 failure with frame sizes larger than 520

diff -r 64d5cd5fb32a -r c34fe0f6a90b src/cpu/aarch64/vm/aarch64.ad
--- a/src/cpu/aarch64/vm/aarch64.ad	Tue Jun 03 10:17:47 2014 +0100
+++ b/src/cpu/aarch64/vm/aarch64.ad	Tue Jun 10 15:43:13 2014 +0100
@@ -897,13 +897,17 @@
   if (framesize == 0) {
     // Is this even possible?
     __ stp(rfp, lr, Address(__ pre(sp, -2 * wordSize)));
-  } else if (framesize < (1 << 12)) {
+  } else if (framesize < ((1 << 9) + 2 * wordSize)) {
     __ sub(sp, sp, framesize);
     __ stp(rfp, lr, Address(sp, framesize - 2 * wordSize));
   } else {
     __ stp(rfp, lr, Address(__ pre(sp, -2 * wordSize)));
-    __ mov(rscratch1, framesize - 2 * wordSize);
-    __ sub(sp, sp, rscratch1);
+    if (framesize < ((1 << 12) + 2 * wordSize))
+      __ sub(sp, sp, framesize - 2 * wordSize);
+    else {
+      __ mov(rscratch1, framesize - 2 * wordSize);
+      __ sub(sp, sp, rscratch1);
+    }
   }
 
   if (NotifySimulator) {
@@ -970,12 +974,16 @@
 
   if (framesize == 0) {
     __ ldp(rfp, lr, Address(__ post(sp, 2 * wordSize)));
-  } else if (framesize < (1 << 12)) {
+  } else if (framesize < ((1 << 9) + 2 * wordSize)) {
     __ ldp(rfp, lr, Address(sp, framesize - 2 * wordSize));
     __ add(sp, sp, framesize);
   } else {
-    __ mov(rscratch1, framesize - 2 * wordSize);
-    __ add(sp, sp, rscratch1);
+    if (framesize < ((1 << 12) + 2 * wordSize))
+      __ add(sp, sp, framesize - 2 * wordSize);
+    else {
+      __ mov(rscratch1, framesize - 2 * wordSize);
+      __ add(sp, sp, rscratch1);
+    }
     __ ldp(rfp, lr, Address(__ post(sp, 2 * wordSize)));
   }
 
--- CUT HERE ---




More information about the aarch64-port-dev mailing list