# HG changeset patch # User Bernhard Urban # Date 1417613344 -3600 # Node ID d806707624bbdf5910a42d0d750b530781883545 # Parent 95ec1f6723ac3133116612c0dedbc9cbc0b9dfbc amd64 register config: reserve "home space" on windows in frame. diff -r 95ec1f6723ac -r d806707624bb graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRegisterConfig.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRegisterConfig.java Wed Dec 03 09:53:46 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRegisterConfig.java Wed Dec 03 14:29:04 2014 +0100 @@ -90,6 +90,12 @@ private final Register[] nativeGeneralParameterRegisters; private final Register[] xmmParameterRegisters = {xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7}; + /* + * 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 final CalleeSaveLayout csl; private static Register findRegister(String name, Register[] all) { @@ -143,9 +149,11 @@ if (config.windowsOs) { javaGeneralParameterRegisters = new Register[]{rdx, r8, r9, rdi, rsi, rcx}; nativeGeneralParameterRegisters = new Register[]{rcx, rdx, r8, r9}; + this.needsNativeStackHomeSpace = true; } else { javaGeneralParameterRegisters = new Register[]{rsi, rdx, rcx, r8, r9, rdi}; nativeGeneralParameterRegisters = new Register[]{rdi, rsi, rdx, rcx, r8, r9}; + this.needsNativeStackHomeSpace = false; } csl = null; @@ -199,7 +207,7 @@ int currentGeneral = 0; int currentXMM = 0; - int currentStackOffset = 0; + int currentStackOffset = type == Type.NativeCall && needsNativeStackHomeSpace ? generalParameterRegisters.length * target.wordSize : 0; for (int i = 0; i < parameterTypes.length; i++) { final Kind kind = parameterTypes[i].getKind();