< prev index next >

src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot.amd64/src/jdk/vm/ci/hotspot/amd64/AMD64HotSpotRegisterConfig.java

Print this page

        

*** 20,39 **** * or visit www.oracle.com if you need additional information or have any * questions. */ package jdk.vm.ci.hotspot.amd64; ! import static jdk.vm.ci.amd64.AMD64.*; ! ! import java.util.*; ! ! import jdk.vm.ci.amd64.*; ! import jdk.vm.ci.code.*; ! import jdk.vm.ci.code.CallingConvention.*; ! import jdk.vm.ci.common.*; ! import jdk.vm.ci.hotspot.*; ! import jdk.vm.ci.meta.*; public class AMD64HotSpotRegisterConfig implements RegisterConfig { private final Architecture architecture; --- 20,70 ---- * or visit www.oracle.com if you need additional information or have any * questions. */ package jdk.vm.ci.hotspot.amd64; ! import static jdk.vm.ci.amd64.AMD64.r12; ! import static jdk.vm.ci.amd64.AMD64.r15; ! import static jdk.vm.ci.amd64.AMD64.r8; ! import static jdk.vm.ci.amd64.AMD64.r9; ! import static jdk.vm.ci.amd64.AMD64.rax; ! import static jdk.vm.ci.amd64.AMD64.rcx; ! import static jdk.vm.ci.amd64.AMD64.rdi; ! import static jdk.vm.ci.amd64.AMD64.rdx; ! import static jdk.vm.ci.amd64.AMD64.rsi; ! import static jdk.vm.ci.amd64.AMD64.rsp; ! import static jdk.vm.ci.amd64.AMD64.xmm0; ! import static jdk.vm.ci.amd64.AMD64.xmm1; ! import static jdk.vm.ci.amd64.AMD64.xmm2; ! import static jdk.vm.ci.amd64.AMD64.xmm3; ! import static jdk.vm.ci.amd64.AMD64.xmm4; ! import static jdk.vm.ci.amd64.AMD64.xmm5; ! import static jdk.vm.ci.amd64.AMD64.xmm6; ! import static jdk.vm.ci.amd64.AMD64.xmm7; ! ! import java.util.ArrayList; ! import java.util.Arrays; ! import java.util.Collections; ! import java.util.HashSet; ! import java.util.Set; ! ! 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.common.JVMCIError; ! import jdk.vm.ci.hotspot.HotSpotVMConfig; ! import jdk.vm.ci.meta.AllocatableValue; ! import jdk.vm.ci.meta.JavaKind; ! import jdk.vm.ci.meta.JavaType; ! import jdk.vm.ci.meta.LIRKind; ! import jdk.vm.ci.meta.PlatformKind; ! import jdk.vm.ci.meta.Value; public class AMD64HotSpotRegisterConfig implements RegisterConfig { private final Architecture architecture;
*** 84,115 **** * Some ABIs (e.g. Windows) require a so-called "home space", that is a save area on the stack * to store the argument registers */ private final boolean needsNativeStackHomeSpace; ! private static Register[] initAllocatable(boolean reserveForHeapBase) { ! Register[] registers = null; ! // @formatter:off ! if (reserveForHeapBase) { ! registers = new Register[] { ! rax, rbx, rcx, rdx, /*rsp,*/ rbp, rsi, rdi, r8, r9, r10, r11, /*r12,*/ r13, r14, /*r15, */ ! xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, ! xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15 ! }; ! } else { ! registers = new Register[] { ! rax, rbx, rcx, rdx, /*rsp,*/ rbp, rsi, rdi, r8, r9, r10, r11, r12, r13, r14, /*r15, */ ! xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, ! xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15 ! }; } ! // @formatter:on return registers; } public AMD64HotSpotRegisterConfig(Architecture architecture, HotSpotVMConfig config) { ! this(architecture, config, initAllocatable(config.useCompressedOops)); assert callerSaved.length >= allocatable.length; } public AMD64HotSpotRegisterConfig(Architecture architecture, HotSpotVMConfig config, Register[] allocatable) { this.architecture = architecture; --- 115,148 ---- * Some ABIs (e.g. Windows) require a so-called "home space", that is a save area on the stack * to store the argument registers */ private final boolean needsNativeStackHomeSpace; ! private static Register[] initAllocatable(Architecture arch, boolean reserveForHeapBase) { ! Register[] allRegisters = arch.getAvailableValueRegisters(); ! Register[] registers = new Register[allRegisters.length - (reserveForHeapBase ? 3 : 2)]; ! ! int idx = 0; ! for (Register reg : allRegisters) { ! if (reg.equals(rsp) || reg.equals(r15)) { ! // skip stack pointer and thread register ! continue; } ! if (reserveForHeapBase && reg.equals(r12)) { ! // skip heap base register ! continue; ! } ! ! registers[idx++] = reg; ! } ! ! assert idx == registers.length; return registers; } public AMD64HotSpotRegisterConfig(Architecture architecture, HotSpotVMConfig config) { ! this(architecture, config, initAllocatable(architecture, config.useCompressedOops)); assert callerSaved.length >= allocatable.length; } public AMD64HotSpotRegisterConfig(Architecture architecture, HotSpotVMConfig config, Register[] allocatable) { this.architecture = architecture;
*** 123,142 **** javaGeneralParameterRegisters = new Register[]{rsi, rdx, rcx, r8, r9, rdi}; nativeGeneralParameterRegisters = new Register[]{rdi, rsi, rdx, rcx, r8, r9}; this.needsNativeStackHomeSpace = false; } ! this.allocatable = allocatable.clone(); Set<Register> callerSaveSet = new HashSet<>(); Collections.addAll(callerSaveSet, allocatable); Collections.addAll(callerSaveSet, xmmParameterRegisters); Collections.addAll(callerSaveSet, javaGeneralParameterRegisters); Collections.addAll(callerSaveSet, nativeGeneralParameterRegisters); callerSaved = callerSaveSet.toArray(new Register[callerSaveSet.size()]); allAllocatableAreCallerSaved = true; ! attributesMap = RegisterAttributes.createMap(this, AMD64.allRegisters); } @Override public Register[] getCallerSaveRegisters() { return callerSaved; --- 156,175 ---- javaGeneralParameterRegisters = new Register[]{rsi, rdx, rcx, r8, r9, rdi}; nativeGeneralParameterRegisters = new Register[]{rdi, rsi, rdx, rcx, r8, r9}; this.needsNativeStackHomeSpace = false; } ! this.allocatable = allocatable; Set<Register> callerSaveSet = new HashSet<>(); Collections.addAll(callerSaveSet, allocatable); Collections.addAll(callerSaveSet, xmmParameterRegisters); Collections.addAll(callerSaveSet, javaGeneralParameterRegisters); Collections.addAll(callerSaveSet, nativeGeneralParameterRegisters); callerSaved = callerSaveSet.toArray(new Register[callerSaveSet.size()]); allAllocatableAreCallerSaved = true; ! attributesMap = RegisterAttributes.createMap(this, architecture.getRegisters()); } @Override public Register[] getCallerSaveRegisters() { return callerSaved;
*** 219,229 **** } if (locations[i] == null) { LIRKind lirKind = target.getLIRKind(kind); locations[i] = StackSlot.get(lirKind, currentStackOffset, !type.out); ! currentStackOffset += Math.max(target.getSizeInBytes(lirKind.getPlatformKind()), target.wordSize); } } JavaKind returnKind = returnType == null ? JavaKind.Void : returnType.getJavaKind(); AllocatableValue returnLocation = returnKind == JavaKind.Void ? Value.ILLEGAL : getReturnRegister(returnKind).asValue(target.getLIRKind(returnKind.getStackKind())); --- 252,262 ---- } if (locations[i] == null) { LIRKind lirKind = target.getLIRKind(kind); locations[i] = StackSlot.get(lirKind, currentStackOffset, !type.out); ! currentStackOffset += Math.max(lirKind.getPlatformKind().getSizeInBytes(), target.wordSize); } } JavaKind returnKind = returnType == null ? JavaKind.Void : returnType.getJavaKind(); AllocatableValue returnLocation = returnKind == JavaKind.Void ? Value.ILLEGAL : getReturnRegister(returnKind).asValue(target.getLIRKind(returnKind.getStackKind()));
< prev index next >