changeset 21267:4f7c7754667a

AMD64/SPARCSpillMoveFactory#createStackMove() delegate to AMD64/SPARCSLIRGenerator#createStackMove().
author Josef Eisl <josef.eisl@jku.at>
date Thu, 07 May 2015 11:00:02 +0200
parents 4f170129a2b5
children 7d998dd2d1b0
files graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/lsra/SSAMoveResolver.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGeneratorTool.java
diffstat 4 files changed, 47 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- 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<PlatformKind.Key, RegisterBackupPair> categorized;
 
     private static class RegisterBackupPair {
         public final Register register;
@@ -93,7 +94,6 @@
     }
 
     private class AMD64SpillMoveFactory implements LIRGeneratorTool.SpillMoveFactory {
-        private Map<PlatformKind.Key, RegisterBackupPair> 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));
--- 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));
--- 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);
     }
--- 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);
         }
     }