< prev index next >

src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot.aarch64/src/jdk/vm/ci/hotspot/aarch64/AArch64HotSpotRegisterConfig.java

Print this page
rev 12173 : 8170106: AArch64: Multiple JVMCI issues
Reviewed-by: duke


   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 package jdk.vm.ci.hotspot.aarch64;
  24 
  25 import static jdk.vm.ci.aarch64.AArch64.lr;
  26 import static jdk.vm.ci.aarch64.AArch64.r0;
  27 import static jdk.vm.ci.aarch64.AArch64.r1;
  28 import static jdk.vm.ci.aarch64.AArch64.r12;
  29 import static jdk.vm.ci.aarch64.AArch64.r2;
  30 import static jdk.vm.ci.aarch64.AArch64.r27;
  31 import static jdk.vm.ci.aarch64.AArch64.r28;
  32 import static jdk.vm.ci.aarch64.AArch64.r29;
  33 import static jdk.vm.ci.aarch64.AArch64.r3;
  34 import static jdk.vm.ci.aarch64.AArch64.r31;
  35 import static jdk.vm.ci.aarch64.AArch64.r4;
  36 import static jdk.vm.ci.aarch64.AArch64.r5;
  37 import static jdk.vm.ci.aarch64.AArch64.r6;
  38 import static jdk.vm.ci.aarch64.AArch64.r7;
  39 import static jdk.vm.ci.aarch64.AArch64.r9;






  40 import static jdk.vm.ci.aarch64.AArch64.sp;
  41 import static jdk.vm.ci.aarch64.AArch64.v0;
  42 import static jdk.vm.ci.aarch64.AArch64.v1;
  43 import static jdk.vm.ci.aarch64.AArch64.v2;
  44 import static jdk.vm.ci.aarch64.AArch64.v3;
  45 import static jdk.vm.ci.aarch64.AArch64.v4;
  46 import static jdk.vm.ci.aarch64.AArch64.v5;
  47 import static jdk.vm.ci.aarch64.AArch64.v6;
  48 import static jdk.vm.ci.aarch64.AArch64.v7;
  49 import static jdk.vm.ci.aarch64.AArch64.zr;
  50 
  51 import java.util.ArrayList;
  52 import java.util.HashSet;
  53 import java.util.List;
  54 import java.util.Set;
  55 
  56 import jdk.vm.ci.aarch64.AArch64;
  57 import jdk.vm.ci.code.Architecture;
  58 import jdk.vm.ci.code.CallingConvention;
  59 import jdk.vm.ci.code.CallingConvention.Type;


  97     public RegisterArray filterAllocatableRegisters(PlatformKind kind, RegisterArray registers) {
  98         ArrayList<Register> list = new ArrayList<>();
  99         for (Register reg : registers) {
 100             if (target.arch.canStoreValue(reg.getRegisterCategory(), kind)) {
 101                 list.add(reg);
 102             }
 103         }
 104 
 105         return new RegisterArray(list);
 106     }
 107 
 108     @Override
 109     public RegisterAttributes[] getAttributesMap() {
 110         return attributesMap.clone();
 111     }
 112 
 113     private final RegisterArray javaGeneralParameterRegisters = new RegisterArray(r1, r2, r3, r4, r5, r6, r7, r0);
 114     private final RegisterArray nativeGeneralParameterRegisters = new RegisterArray(r0, r1, r2, r3, r4, r5, r6, r7);
 115     private final RegisterArray simdParameterRegisters = new RegisterArray(v0, v1, v2, v3, v4, v5, v6, v7);
 116 
 117     public static final Register inlineCacheRegister = r9;
 118 
 119     /**
 120      * Vtable stubs expect the metaspace Method in r12.
 121      */
 122     public static final Register metaspaceMethodRegister = r12;
 123 
 124     public static final Register heapBaseRegister = r27;
 125     public static final Register threadRegister = r28;
 126     public static final Register fp = r29;
 127 
 128     private static final RegisterArray reservedRegisters = new RegisterArray(threadRegister, fp, lr, r31, zr, sp);

 129 
 130     private static RegisterArray initAllocatable(Architecture arch, boolean reserveForHeapBase) {
 131         RegisterArray allRegisters = arch.getAvailableValueRegisters();
 132         Register[] registers = new Register[allRegisters.size() - reservedRegisters.size() - (reserveForHeapBase ? 1 : 0)];
 133         List<Register> reservedRegistersList = reservedRegisters.asList();
 134 
 135         int idx = 0;
 136         for (Register reg : allRegisters) {
 137             if (reservedRegistersList.contains(reg)) {
 138                 // skip reserved registers
 139                 continue;
 140             }
 141             assert !(reg.equals(threadRegister) || reg.equals(fp) || reg.equals(lr) || reg.equals(r31) || reg.equals(zr) || reg.equals(sp));
 142             if (reserveForHeapBase && reg.equals(heapBaseRegister)) {
 143                 // skip heap base register
 144                 continue;
 145             }
 146 
 147             registers[idx++] = reg;
 148         }




   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 package jdk.vm.ci.hotspot.aarch64;
  24 
  25 import static jdk.vm.ci.aarch64.AArch64.lr;
  26 import static jdk.vm.ci.aarch64.AArch64.r0;
  27 import static jdk.vm.ci.aarch64.AArch64.r1;

  28 import static jdk.vm.ci.aarch64.AArch64.r2;



  29 import static jdk.vm.ci.aarch64.AArch64.r3;

  30 import static jdk.vm.ci.aarch64.AArch64.r4;
  31 import static jdk.vm.ci.aarch64.AArch64.r5;
  32 import static jdk.vm.ci.aarch64.AArch64.r6;
  33 import static jdk.vm.ci.aarch64.AArch64.r7;
  34 import static jdk.vm.ci.aarch64.AArch64.rscratch1;
  35 import static jdk.vm.ci.aarch64.AArch64.rscratch2;
  36 import static jdk.vm.ci.aarch64.AArch64.r12;
  37 import static jdk.vm.ci.aarch64.AArch64.r27;
  38 import static jdk.vm.ci.aarch64.AArch64.r28;
  39 import static jdk.vm.ci.aarch64.AArch64.r29;
  40 import static jdk.vm.ci.aarch64.AArch64.r31;
  41 import static jdk.vm.ci.aarch64.AArch64.sp;
  42 import static jdk.vm.ci.aarch64.AArch64.v0;
  43 import static jdk.vm.ci.aarch64.AArch64.v1;
  44 import static jdk.vm.ci.aarch64.AArch64.v2;
  45 import static jdk.vm.ci.aarch64.AArch64.v3;
  46 import static jdk.vm.ci.aarch64.AArch64.v4;
  47 import static jdk.vm.ci.aarch64.AArch64.v5;
  48 import static jdk.vm.ci.aarch64.AArch64.v6;
  49 import static jdk.vm.ci.aarch64.AArch64.v7;
  50 import static jdk.vm.ci.aarch64.AArch64.zr;
  51 
  52 import java.util.ArrayList;
  53 import java.util.HashSet;
  54 import java.util.List;
  55 import java.util.Set;
  56 
  57 import jdk.vm.ci.aarch64.AArch64;
  58 import jdk.vm.ci.code.Architecture;
  59 import jdk.vm.ci.code.CallingConvention;
  60 import jdk.vm.ci.code.CallingConvention.Type;


  98     public RegisterArray filterAllocatableRegisters(PlatformKind kind, RegisterArray registers) {
  99         ArrayList<Register> list = new ArrayList<>();
 100         for (Register reg : registers) {
 101             if (target.arch.canStoreValue(reg.getRegisterCategory(), kind)) {
 102                 list.add(reg);
 103             }
 104         }
 105 
 106         return new RegisterArray(list);
 107     }
 108 
 109     @Override
 110     public RegisterAttributes[] getAttributesMap() {
 111         return attributesMap.clone();
 112     }
 113 
 114     private final RegisterArray javaGeneralParameterRegisters = new RegisterArray(r1, r2, r3, r4, r5, r6, r7, r0);
 115     private final RegisterArray nativeGeneralParameterRegisters = new RegisterArray(r0, r1, r2, r3, r4, r5, r6, r7);
 116     private final RegisterArray simdParameterRegisters = new RegisterArray(v0, v1, v2, v3, v4, v5, v6, v7);
 117 
 118     public static final Register inlineCacheRegister = rscratch2;
 119 
 120     /**
 121      * Vtable stubs expect the metaspace Method in r12.
 122      */
 123     public static final Register metaspaceMethodRegister = r12;
 124 
 125     public static final Register heapBaseRegister = r27;
 126     public static final Register threadRegister = r28;
 127     public static final Register fp = r29;
 128 
 129     private static final RegisterArray reservedRegisters
 130         = new RegisterArray(rscratch1, rscratch2, threadRegister, fp, lr, r31, zr, sp);
 131 
 132     private static RegisterArray initAllocatable(Architecture arch, boolean reserveForHeapBase) {
 133         RegisterArray allRegisters = arch.getAvailableValueRegisters();
 134         Register[] registers = new Register[allRegisters.size() - reservedRegisters.size() - (reserveForHeapBase ? 1 : 0)];
 135         List<Register> reservedRegistersList = reservedRegisters.asList();
 136 
 137         int idx = 0;
 138         for (Register reg : allRegisters) {
 139             if (reservedRegistersList.contains(reg)) {
 140                 // skip reserved registers
 141                 continue;
 142             }
 143             assert !(reg.equals(threadRegister) || reg.equals(fp) || reg.equals(lr) || reg.equals(r31) || reg.equals(zr) || reg.equals(sp));
 144             if (reserveForHeapBase && reg.equals(heapBaseRegister)) {
 145                 // skip heap base register
 146                 continue;
 147             }
 148 
 149             registers[idx++] = reg;
 150         }


< prev index next >