aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Nevill edward.nevill@linaro.org <Edward Nevill edward.nevill@linaro.org>2014-06-11 13:49:18 +0100
committerEdward Nevill edward.nevill@linaro.org <Edward Nevill edward.nevill@linaro.org>2014-06-11 13:49:18 +0100
commitac023bc0a894afeb1cf4b84656a796ff3a1ba831 (patch)
tree6506c27488da2aea80d1bf6f6c2f77953e2df79a
parent859e348c4675c0ffdcd7706c8f36875aafc867ac (diff)
Fix C2 failure with frame sizes larger than 520
-rw-r--r--src/cpu/aarch64/vm/aarch64.ad20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/cpu/aarch64/vm/aarch64.ad b/src/cpu/aarch64/vm/aarch64.ad
index 13c619a3e..45a5b17bd 100644
--- a/src/cpu/aarch64/vm/aarch64.ad
+++ b/src/cpu/aarch64/vm/aarch64.ad
@@ -990,13 +990,17 @@ void MachPrologNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
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) {
@@ -1063,12 +1067,16 @@ void MachEpilogNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
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)));
}