# HG changeset patch # User Josef Eisl # Date 1430989202 -7200 # Node ID 4f7c7754667a0ae0782efda7485bcf36a606e3e2 # Parent 4f170129a2b5a19ebb068857657555b639c6e594 AMD64/SPARCSpillMoveFactory#createStackMove() delegate to AMD64/SPARCSLIRGenerator#createStackMove(). diff -r 4f170129a2b5 -r 4f7c7754667a graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java --- a/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java Wed May 06 22:28:58 2015 -0700 +++ b/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java Thu May 07 11:00:02 2015 +0200 @@ -81,6 +81,7 @@ private static final RegisterValue RCX_I = AMD64.rcx.asValue(LIRKind.value(Kind.Int)); private AMD64SpillMoveFactory moveFactory; + private Map categorized; private static class RegisterBackupPair { public final Register register; @@ -93,7 +94,6 @@ } private class AMD64SpillMoveFactory implements LIRGeneratorTool.SpillMoveFactory { - private Map categorized; @Override public LIRInstruction createMove(AllocatableValue result, Value input) { @@ -101,35 +101,10 @@ } @Override - public LIRInstruction createStackMove(AllocatableValue result, Value input) { - RegisterBackupPair backup = getScratchRegister(input.getPlatformKind()); - return new AMD64StackMove(result, input, backup.register, backup.backupSlot); + public LIRInstruction createStackMove(StackSlotValue result, StackSlotValue input) { + return AMD64LIRGenerator.this.createStackMove(result, input); } - private RegisterBackupPair getScratchRegister(PlatformKind kind) { - PlatformKind.Key key = kind.getKey(); - if (categorized == null) { - categorized = new HashMap<>(); - } else if (categorized.containsKey(key)) { - return categorized.get(key); - } - - FrameMapBuilder frameMapBuilder = getResult().getFrameMapBuilder(); - RegisterConfig registerConfig = frameMapBuilder.getRegisterConfig(); - - Register[] availableRegister = registerConfig.filterAllocatableRegisters(kind, registerConfig.getAllocatableRegisters()); - assert availableRegister != null && availableRegister.length > 1; - Register scratchRegister = availableRegister[0]; - - Architecture arch = frameMapBuilder.getCodeCache().getTarget().arch; - LIRKind largestKind = LIRKind.value(arch.getLargestStorableKind(scratchRegister.getRegisterCategory())); - VirtualStackSlot backupSlot = frameMapBuilder.allocateSpillSlot(largestKind); - - RegisterBackupPair value = new RegisterBackupPair(scratchRegister, backupSlot); - categorized.put(key, value); - - return value; - } } public AMD64LIRGenerator(LIRKindTool lirKindTool, Providers providers, CallingConvention cc, LIRGenerationResult lirGenRes) { @@ -165,6 +140,42 @@ } } + protected LIRInstruction createStackMove(StackSlotValue result, StackSlotValue input) { + RegisterBackupPair backup = getScratchRegister(input.getPlatformKind()); + Register scratchRegister = backup.register; + StackSlotValue backupSlot = backup.backupSlot; + return createStackMove(result, input, scratchRegister, backupSlot); + } + + protected LIRInstruction createStackMove(StackSlotValue result, StackSlotValue input, Register scratchRegister, StackSlotValue backupSlot) { + return new AMD64StackMove(result, input, scratchRegister, backupSlot); + } + + protected RegisterBackupPair getScratchRegister(PlatformKind kind) { + PlatformKind.Key key = kind.getKey(); + if (categorized == null) { + categorized = new HashMap<>(); + } else if (categorized.containsKey(key)) { + return categorized.get(key); + } + + FrameMapBuilder frameMapBuilder = getResult().getFrameMapBuilder(); + RegisterConfig registerConfig = frameMapBuilder.getRegisterConfig(); + + Register[] availableRegister = registerConfig.filterAllocatableRegisters(kind, registerConfig.getAllocatableRegisters()); + assert availableRegister != null && availableRegister.length > 1; + Register scratchRegister = availableRegister[0]; + + Architecture arch = frameMapBuilder.getCodeCache().getTarget().arch; + LIRKind largestKind = LIRKind.value(arch.getLargestStorableKind(scratchRegister.getRegisterCategory())); + VirtualStackSlot backupSlot = frameMapBuilder.allocateSpillSlot(largestKind); + + RegisterBackupPair value = new RegisterBackupPair(scratchRegister, backupSlot); + categorized.put(key, value); + + return value; + } + @Override public void emitMove(AllocatableValue dst, Value src) { append(createMove(dst, src)); diff -r 4f170129a2b5 -r 4f7c7754667a graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java --- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Wed May 06 22:28:58 2015 -0700 +++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Thu May 07 11:00:02 2015 +0200 @@ -81,8 +81,8 @@ } @Override - public LIRInstruction createStackMove(AllocatableValue result, Value input) { - return new SPARCStackMove(result, input); + public LIRInstruction createStackMove(StackSlotValue result, StackSlotValue input) { + return SPARCLIRGenerator.this.createStackMove(result, input); } } @@ -125,6 +125,10 @@ } } + protected LIRInstruction createStackMove(StackSlotValue result, StackSlotValue input) { + return new SPARCStackMove(result, input); + } + @Override public void emitMove(AllocatableValue dst, Value src) { append(createMove(dst, src)); diff -r 4f170129a2b5 -r 4f7c7754667a graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/lsra/SSAMoveResolver.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/lsra/SSAMoveResolver.java Wed May 06 22:28:58 2015 -0700 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/lsra/SSAMoveResolver.java Thu May 07 11:00:02 2015 +0200 @@ -114,7 +114,7 @@ @Override protected LIRInstruction createMove(AllocatableValue fromOpr, AllocatableValue toOpr, AllocatableValue fromLocation, AllocatableValue toLocation) { if (isStackSlotValue(toLocation) && isStackSlotValue(fromLocation)) { - return getAllocator().getSpillMoveFactory().createStackMove(toOpr, fromOpr); + return getAllocator().getSpillMoveFactory().createStackMove(asStackSlotValue(toOpr), asStackSlotValue(fromOpr)); } return super.createMove(fromOpr, toOpr, fromLocation, toLocation); } diff -r 4f170129a2b5 -r 4f7c7754667a graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGeneratorTool.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGeneratorTool.java Wed May 06 22:28:58 2015 -0700 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGeneratorTool.java Thu May 07 11:00:02 2015 +0200 @@ -37,7 +37,7 @@ LIRInstruction createMove(AllocatableValue result, Value input); - default LIRInstruction createStackMove(AllocatableValue result, Value input) { + default LIRInstruction createStackMove(StackSlotValue result, StackSlotValue input) { return new StackMove(result, input); } }