[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