< 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

        

*** 47,67 **** import static jdk.vm.ci.aarch64.AArch64.v6; import static jdk.vm.ci.aarch64.AArch64.v7; import static jdk.vm.ci.aarch64.AArch64.zr; import java.util.ArrayList; - import java.util.Arrays; - import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import jdk.vm.ci.aarch64.AArch64; import jdk.vm.ci.code.Architecture; import jdk.vm.ci.code.CallingConvention; import jdk.vm.ci.code.CallingConvention.Type; import jdk.vm.ci.code.Register; import jdk.vm.ci.code.RegisterAttributes; import jdk.vm.ci.code.RegisterConfig; import jdk.vm.ci.code.StackSlot; import jdk.vm.ci.code.TargetDescription; import jdk.vm.ci.code.ValueKindFactory; --- 47,66 ---- import static jdk.vm.ci.aarch64.AArch64.v6; import static jdk.vm.ci.aarch64.AArch64.v7; import static jdk.vm.ci.aarch64.AArch64.zr; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import jdk.vm.ci.aarch64.AArch64; import jdk.vm.ci.code.Architecture; import jdk.vm.ci.code.CallingConvention; import jdk.vm.ci.code.CallingConvention.Type; import jdk.vm.ci.code.Register; + import jdk.vm.ci.code.RegisterArray; import jdk.vm.ci.code.RegisterAttributes; import jdk.vm.ci.code.RegisterConfig; import jdk.vm.ci.code.StackSlot; import jdk.vm.ci.code.TargetDescription; import jdk.vm.ci.code.ValueKindFactory;
*** 76,122 **** public class AArch64HotSpotRegisterConfig implements RegisterConfig { private final TargetDescription target; ! private final Register[] allocatable; /** * The caller saved registers always include all parameter registers. */ ! private final Register[] callerSaved; private final boolean allAllocatableAreCallerSaved; private final RegisterAttributes[] attributesMap; @Override ! public Register[] getAllocatableRegisters() { ! return allocatable.clone(); } @Override ! public Register[] filterAllocatableRegisters(PlatformKind kind, Register[] registers) { ArrayList<Register> list = new ArrayList<>(); for (Register reg : registers) { if (target.arch.canStoreValue(reg.getRegisterCategory(), kind)) { list.add(reg); } } ! Register[] ret = list.toArray(new Register[list.size()]); ! return ret; } @Override public RegisterAttributes[] getAttributesMap() { return attributesMap.clone(); } ! private final Register[] javaGeneralParameterRegisters = {r1, r2, r3, r4, r5, r6, r7, r0}; ! private final Register[] nativeGeneralParameterRegisters = {r0, r1, r2, r3, r4, r5, r6, r7}; ! private final Register[] simdParameterRegisters = {v0, v1, v2, v3, v4, v5, v6, v7}; public static final Register inlineCacheRegister = r9; /** * Vtable stubs expect the metaspace Method in r12. --- 75,120 ---- public class AArch64HotSpotRegisterConfig implements RegisterConfig { private final TargetDescription target; ! private final RegisterArray allocatable; /** * The caller saved registers always include all parameter registers. */ ! private final RegisterArray callerSaved; private final boolean allAllocatableAreCallerSaved; private final RegisterAttributes[] attributesMap; @Override ! public RegisterArray getAllocatableRegisters() { ! return allocatable; } @Override ! public RegisterArray filterAllocatableRegisters(PlatformKind kind, RegisterArray registers) { ArrayList<Register> list = new ArrayList<>(); for (Register reg : registers) { if (target.arch.canStoreValue(reg.getRegisterCategory(), kind)) { list.add(reg); } } ! return new RegisterArray(list); } @Override public RegisterAttributes[] getAttributesMap() { return attributesMap.clone(); } ! private final RegisterArray javaGeneralParameterRegisters = new RegisterArray(r1, r2, r3, r4, r5, r6, r7, r0); ! private final RegisterArray nativeGeneralParameterRegisters = new RegisterArray(r0, r1, r2, r3, r4, r5, r6, r7); ! private final RegisterArray simdParameterRegisters = new RegisterArray(v0, v1, v2, v3, v4, v5, v6, v7); public static final Register inlineCacheRegister = r9; /** * Vtable stubs expect the metaspace Method in r12.
*** 125,140 **** public static final Register heapBaseRegister = r27; public static final Register threadRegister = r28; public static final Register fp = r29; ! private static final Register[] reservedRegisters = {threadRegister, fp, lr, r31, zr, sp}; ! private static Register[] initAllocatable(Architecture arch, boolean reserveForHeapBase) { ! Register[] allRegisters = arch.getAvailableValueRegisters(); ! Register[] registers = new Register[allRegisters.length - reservedRegisters.length - (reserveForHeapBase ? 1 : 0)]; ! List<Register> reservedRegistersList = Arrays.asList(reservedRegisters); int idx = 0; for (Register reg : allRegisters) { if (reservedRegistersList.contains(reg)) { // skip reserved registers --- 123,138 ---- public static final Register heapBaseRegister = r27; public static final Register threadRegister = r28; public static final Register fp = r29; ! private static final RegisterArray reservedRegisters = new RegisterArray(threadRegister, fp, lr, r31, zr, sp); ! private static RegisterArray initAllocatable(Architecture arch, boolean reserveForHeapBase) { ! RegisterArray allRegisters = arch.getAvailableValueRegisters(); ! Register[] registers = new Register[allRegisters.size() - reservedRegisters.size() - (reserveForHeapBase ? 1 : 0)]; ! List<Register> reservedRegistersList = reservedRegisters.asList(); int idx = 0; for (Register reg : allRegisters) { if (reservedRegistersList.contains(reg)) { // skip reserved registers
*** 148,186 **** registers[idx++] = reg; } assert idx == registers.length; ! return registers; } public AArch64HotSpotRegisterConfig(TargetDescription target, boolean useCompressedOops) { this(target, initAllocatable(target.arch, useCompressedOops)); ! assert callerSaved.length >= allocatable.length; } ! public AArch64HotSpotRegisterConfig(TargetDescription target, Register[] allocatable) { this.target = target; ! this.allocatable = allocatable.clone(); Set<Register> callerSaveSet = new HashSet<>(); ! Collections.addAll(callerSaveSet, allocatable); ! Collections.addAll(callerSaveSet, simdParameterRegisters); ! Collections.addAll(callerSaveSet, javaGeneralParameterRegisters); ! Collections.addAll(callerSaveSet, nativeGeneralParameterRegisters); ! callerSaved = callerSaveSet.toArray(new Register[callerSaveSet.size()]); allAllocatableAreCallerSaved = true; attributesMap = RegisterAttributes.createMap(this, AArch64.allRegisters); } @Override ! public Register[] getCallerSaveRegisters() { return callerSaved; } ! public Register[] getCalleeSaveRegisters() { return null; } @Override public boolean areAllAllocatableRegistersCallerSaved() { --- 146,184 ---- registers[idx++] = reg; } assert idx == registers.length; ! return new RegisterArray(registers); } public AArch64HotSpotRegisterConfig(TargetDescription target, boolean useCompressedOops) { this(target, initAllocatable(target.arch, useCompressedOops)); ! assert callerSaved.size() >= allocatable.size(); } ! public AArch64HotSpotRegisterConfig(TargetDescription target, RegisterArray allocatable) { this.target = target; ! this.allocatable = allocatable; Set<Register> callerSaveSet = new HashSet<>(); ! allocatable.addTo(callerSaveSet); ! simdParameterRegisters.addTo(callerSaveSet); ! javaGeneralParameterRegisters.addTo(callerSaveSet); ! nativeGeneralParameterRegisters.addTo(callerSaveSet); ! callerSaved = new RegisterArray(callerSaveSet); allAllocatableAreCallerSaved = true; attributesMap = RegisterAttributes.createMap(this, AArch64.allRegisters); } @Override ! public RegisterArray getCallerSaveRegisters() { return callerSaved; } ! public RegisterArray getCalleeSaveRegisters() { return null; } @Override public boolean areAllAllocatableRegistersCallerSaved() {
*** 197,207 **** // from the caller or callee perspective return callingConvention(javaGeneralParameterRegisters, returnType, parameterTypes, hotspotType, valueKindFactory); } @Override ! public Register[] getCallingConventionRegisters(Type type, JavaKind kind) { HotSpotCallingConventionType hotspotType = (HotSpotCallingConventionType) type; switch (kind) { case Boolean: case Byte: case Short: --- 195,205 ---- // from the caller or callee perspective return callingConvention(javaGeneralParameterRegisters, returnType, parameterTypes, hotspotType, valueKindFactory); } @Override ! public RegisterArray getCallingConventionRegisters(Type type, JavaKind kind) { HotSpotCallingConventionType hotspotType = (HotSpotCallingConventionType) type; switch (kind) { case Boolean: case Byte: case Short:
*** 216,226 **** default: throw JVMCIError.shouldNotReachHere(); } } ! private CallingConvention callingConvention(Register[] generalParameterRegisters, JavaType returnType, JavaType[] parameterTypes, HotSpotCallingConventionType type, ValueKindFactory<?> valueKindFactory) { AllocatableValue[] locations = new AllocatableValue[parameterTypes.length]; int currentGeneral = 0; int currentSIMD = 0; --- 214,224 ---- default: throw JVMCIError.shouldNotReachHere(); } } ! private CallingConvention callingConvention(RegisterArray generalParameterRegisters, JavaType returnType, JavaType[] parameterTypes, HotSpotCallingConventionType type, ValueKindFactory<?> valueKindFactory) { AllocatableValue[] locations = new AllocatableValue[parameterTypes.length]; int currentGeneral = 0; int currentSIMD = 0;
*** 235,253 **** case Short: case Char: case Int: case Long: case Object: ! if (currentGeneral < generalParameterRegisters.length) { ! Register register = generalParameterRegisters[currentGeneral++]; locations[i] = register.asValue(valueKindFactory.getValueKind(kind)); } break; case Float: case Double: ! if (currentSIMD < simdParameterRegisters.length) { ! Register register = simdParameterRegisters[currentSIMD++]; locations[i] = register.asValue(valueKindFactory.getValueKind(kind)); } break; default: throw JVMCIError.shouldNotReachHere(); --- 233,251 ---- case Short: case Char: case Int: case Long: case Object: ! if (currentGeneral < generalParameterRegisters.size()) { ! Register register = generalParameterRegisters.get(currentGeneral++); locations[i] = register.asValue(valueKindFactory.getValueKind(kind)); } break; case Float: case Double: ! if (currentSIMD < simdParameterRegisters.size()) { ! Register register = simdParameterRegisters.get(currentSIMD++); locations[i] = register.asValue(valueKindFactory.getValueKind(kind)); } break; default: throw JVMCIError.shouldNotReachHere();
*** 292,299 **** return sp; } @Override public String toString() { ! return String.format("Allocatable: " + Arrays.toString(getAllocatableRegisters()) + "%n" + "CallerSave: " + Arrays.toString(getCallerSaveRegisters()) + "%n"); } } --- 290,297 ---- return sp; } @Override public String toString() { ! return String.format("Allocatable: " + getAllocatableRegisters() + "%n" + "CallerSave: " + getCallerSaveRegisters() + "%n"); } }
< prev index next >