# HG changeset patch # User Gilles Duboscq # Date 1344363197 25200 # Node ID afd2508528f54dfcc7a41612081dc3acddd22ffa # Parent 77196bba55758fb5139742a4563fd0f2665a10bd The targetAdress should be moved to a fixed register for indirect call. Fix from Christian Wimmer diff -r 77196bba5575 -r afd2508528f5 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/HotSpotAMD64Backend.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/HotSpotAMD64Backend.java Mon Jul 30 08:37:04 2012 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/HotSpotAMD64Backend.java Tue Aug 07 11:13:17 2012 -0700 @@ -165,7 +165,9 @@ assert methodOopNode != null; Value methodOop = AMD64.rbx.asValue(); emitMove(operand(methodOopNode), methodOop); - append(new AMD64IndirectCallOp(callTarget.targetMethod(), result, parameters, methodOop, operand(callTarget.computedAddress()), callState)); + Value targetAddress = AMD64.rax.asValue(); + emitMove(operand(callTarget.computedAddress()), targetAddress); + append(new AMD64IndirectCallOp(callTarget.targetMethod(), result, parameters, methodOop, targetAddress, callState)); } if (isLegal(result)) { diff -r 77196bba5575 -r afd2508528f5 graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Call.java --- a/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Call.java Mon Jul 30 08:37:04 2012 -0700 +++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Call.java Tue Aug 07 11:13:17 2012 -0700 @@ -105,6 +105,12 @@ } indirectCall(tasm, masm, asRegister(targetAddress), targetMethod, state); } + + @Override + protected void verify() { + super.verify(); + assert isRegister(targetAddress) : "The current register allocator cannot handle variables to be used at call sites, it must be in a fixed register for now"; + } } public static void directCall(TargetMethodAssembler tasm, AMD64MacroAssembler masm, Object target, LIRFrameState info) {