changeset 2217:2a36994d0967

Fixed an issue where parameter registers were hard coded to Linux values.
author Thomas Wuerthinger <thomas.wuerthinger@gmail.com>
date Mon, 21 Feb 2011 21:16:29 +0100
parents b966d9b66bf9
children 686f5091af28
files c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotXirGenerator.java
diffstat 1 files changed, 11 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotXirGenerator.java	Mon Feb 21 20:51:59 2011 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotXirGenerator.java	Mon Feb 21 21:16:29 2011 +0100
@@ -29,6 +29,7 @@
 
 import com.sun.c1x.target.amd64.*;
 import com.sun.cri.ci.CiAddress.Scale;
+import com.sun.cri.ci.CiRegister.*;
 import com.sun.cri.ci.*;
 import com.sun.cri.ri.*;
 import com.sun.cri.ri.RiType.Representation;
@@ -320,7 +321,9 @@
             final boolean useInfoAfter = true;
 
             if (config.useFastLocking) {
-                useRegisters(asm, AMD64.rbx, AMD64.rsi, AMD64.rdx, AMD64.rax);
+                useRegisters(asm, AMD64.rax, AMD64.rbx);
+                useRegisters(asm, getGeneralParameterRegister(0));
+                useRegisters(asm, getGeneralParameterRegister(1));
                 asm.callRuntime(config.fastMonitorEnterStub, null, useInfoAfter, object, lock);
             } else {
                 asm.reserveOutgoingStack(target.wordSize * 2);
@@ -333,6 +336,10 @@
         }
     };
 
+    private static CiRegister getGeneralParameterRegister(int index) {
+        return Compiler.getInstance().getRegisterConfig().getCallingConventionRegisters(CiCallingConvention.Type.RuntimeCall, RegisterFlag.CPU)[index];
+    }
+
     private SimpleTemplates monitorExitTemplates = new SimpleTemplates(NULL_CHECK) {
 
         @Override
@@ -342,7 +349,9 @@
             XirParameter lock = asm.createInputParameter("lock", CiKind.Word);
 
             if (config.useFastLocking) {
-                useRegisters(asm, AMD64.rbx, AMD64.rsi, AMD64.rdx, AMD64.rax);
+                useRegisters(asm, AMD64.rax, AMD64.rbx);
+                useRegisters(asm, getGeneralParameterRegister(0));
+                useRegisters(asm, getGeneralParameterRegister(1));
                 asm.callRuntime(config.fastMonitorExitStub, null, object, lock);
             } else {
                 asm.reserveOutgoingStack(target.wordSize);