[aarch64-port-dev ] Use ADD after ARDP rather than LEA

Andrew Haley aph at redhat.com
Thu Dec 19 09:32:14 PST 2013


This is an interesting one: if heap_top happens to be exactly on a page
boundary we got an internal error.  Fixed thusly, explanation in comment.

Andrew.


# HG changeset patch
# User aph
# Date 1387473869 0
# Node ID 493467bb0f072be158c80cb1fd28c5e9608cf65e
# Parent  18fdef53937828aaada5f1b618c2535ea6a189de
Use ADD after ARDP rather than LEA.

diff -r 18fdef539378 -r 493467bb0f07 src/cpu/aarch64/vm/macroAssembler_aarch64.cpp
--- a/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp	Thu Dec 19 16:29:05 2013 +0000
+++ b/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp	Thu Dec 19 17:24:29 2013 +0000
@@ -2617,7 +2617,12 @@
     {
       unsigned long offset;
       adrp(rscratch1, heap_top, offset);
-      lea(rscratch1, Address(rscratch1, offset));
+      // Use add() here after ARDP, rather than lea().
+      // lea() does not generate anything if its offset is zero.
+      // However, relocs expect to find either an ADD or a load/store
+      // insn after an ADRP.  add() always generates an ADD insn, even
+      // for add(Rn, Rn, 0).
+      add(rscratch1, rscratch1, offset);
       ldaxr(obj, rscratch1);
     }




More information about the aarch64-port-dev mailing list