changeset 22595:dcfd57b9f2d3

Update jvmci import: Remove Value.getKind().
author Roland Schatz <roland.schatz@oracle.com>
date Tue, 08 Sep 2015 15:11:16 +0200
parents d7f7a7c29670
children b3c4b69bc71f
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.compiler/src/com/oracle/graal/compiler/gen/BytecodeLIRBuilder.java graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRBuilder.java graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotBytecodeLIRBuilder.java graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotJumpToExceptionHandlerOp.java graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotPatchReturnAddressOp.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/ForeignCallStub.java graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Arithmetic.java graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64ArrayEqualsOp.java graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64ByteSwapOp.java graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64ControlFlow.java graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64MathIntrinsicOp.java graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Move.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArithmetic.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArrayEqualsOp.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCBitManipulationOp.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCByteSwapOp.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCCompare.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMathIntrinsicOp.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCTestOp.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/lsra/LinearScanIntervalDumper.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/lsra/LinearScanLifetimeAnalysisPhase.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceIntervalDumper.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceLinearScanLifetimeAnalysisPhase.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/asm/CompilationResultBuilder.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGenerator.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/stackslotalloc/StackIntervalDumper.java mx.graal/suite.py
diffstat 33 files changed, 420 insertions(+), 436 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java	Tue Sep 08 15:11:16 2015 +0200
@@ -167,9 +167,9 @@
         } else if (isJavaConstant(src)) {
             return createMoveConstant(dst, asJavaConstant(src));
         } else if (isRegister(src) || isStackSlotValue(dst)) {
-            return new MoveFromRegOp(dst.getKind(), dst, (AllocatableValue) src);
+            return new MoveFromRegOp((Kind) dst.getPlatformKind(), dst, (AllocatableValue) src);
         } else {
-            return new MoveToRegOp(dst.getKind(), dst, (AllocatableValue) src);
+            return new MoveToRegOp((Kind) dst.getPlatformKind(), dst, (AllocatableValue) src);
         }
     }
 
@@ -178,14 +178,13 @@
     }
 
     protected LIRInstruction createStackMove(AllocatableValue result, AllocatableValue input) {
-        Kind kind = result.getKind();
+        PlatformKind kind = result.getPlatformKind();
         OperandSize size;
-        switch (kind) {
-            case Long:
-            case Double:
+        switch (target().getSizeInBytes(kind)) {
+            case 8:
                 size = QWORD;
                 break;
-            case Short:
+            case 2:
                 size = WORD;
                 break;
             default:
@@ -439,7 +438,7 @@
 
     @Override
     public void emitNullCheck(Value address, LIRFrameState state) {
-        assert address.getKind() == Kind.Object || address.getKind() == Kind.Long : address + " - " + address.getKind() + " not a pointer!";
+        assert address.getPlatformKind() == Kind.Object || address.getPlatformKind() == Kind.Long : address + " - " + address.getPlatformKind() + " not a pointer!";
         append(new AMD64Move.NullCheckOp(asAddressValue(address), state));
     }
 
@@ -505,8 +504,8 @@
     }
 
     private void emitIntegerTest(Value a, Value b) {
-        assert a.getKind().isNumericInteger();
-        OperandSize size = a.getKind() == Kind.Long ? QWORD : DWORD;
+        assert ((Kind) a.getPlatformKind()).isNumericInteger();
+        OperandSize size = (Kind) a.getPlatformKind() == Kind.Long ? QWORD : DWORD;
         if (isJavaConstant(b) && NumUtil.is32bit(asJavaConstant(b).asLong())) {
             append(new AMD64BinaryConsumer.ConstOp(AMD64MIOp.TEST, size, asAllocatable(a), (int) asJavaConstant(b).asLong()));
         } else if (isJavaConstant(a) && NumUtil.is32bit(asJavaConstant(a).asLong())) {
@@ -649,7 +648,7 @@
     public Variable emitNegate(Value inputVal) {
         AllocatableValue input = asAllocatable(inputVal);
         Variable result = newVariable(LIRKind.combine(input));
-        switch (input.getKind()) {
+        switch ((Kind) input.getPlatformKind()) {
             case Int:
                 append(new AMD64Unary.MOp(NEG, DWORD, result, input));
                 break;
@@ -672,7 +671,7 @@
     public Variable emitNot(Value inputVal) {
         AllocatableValue input = asAllocatable(inputVal);
         Variable result = newVariable(LIRKind.combine(input));
-        switch (input.getKind()) {
+        switch ((Kind) input.getPlatformKind()) {
             case Int:
                 append(new AMD64Unary.MOp(NOT, DWORD, result, input));
                 break;
@@ -763,7 +762,7 @@
 
     @Override
     public Variable emitAdd(LIRKind resultKind, Value a, Value b, boolean setFlags) {
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitBinary(resultKind, ADD, DWORD, true, a, b, setFlags);
             case Long:
@@ -779,7 +778,7 @@
 
     @Override
     public Variable emitSub(LIRKind resultKind, Value a, Value b, boolean setFlags) {
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitBinary(resultKind, SUB, DWORD, false, a, b, setFlags);
             case Long:
@@ -824,7 +823,7 @@
 
     @Override
     public Variable emitMul(Value a, Value b, boolean setFlags) {
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitIMUL(DWORD, a, b);
             case Long:
@@ -851,7 +850,7 @@
 
     @Override
     public Value emitMulHigh(Value a, Value b) {
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitMulHigh(AMD64MOp.IMUL, DWORD, a, b);
             case Long:
@@ -863,7 +862,7 @@
 
     @Override
     public Value emitUMulHigh(Value a, Value b) {
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitMulHigh(AMD64MOp.MUL, DWORD, a, b);
             case Long:
@@ -928,7 +927,7 @@
 
     public Value[] emitIntegerDivRem(Value a, Value b, LIRFrameState state) {
         AMD64MulDivOp op;
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 op = emitIDIV(DWORD, a, b, state);
                 break;
@@ -943,7 +942,7 @@
 
     @Override
     public Value emitDiv(Value a, Value b, LIRFrameState state) {
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 AMD64MulDivOp op = emitIDIV(DWORD, a, b, state);
                 return emitMove(op.getQuotient());
@@ -961,7 +960,7 @@
 
     @Override
     public Value emitRem(Value a, Value b, LIRFrameState state) {
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 AMD64MulDivOp op = emitIDIV(DWORD, a, b, state);
                 return emitMove(op.getRemainder());
@@ -986,7 +985,7 @@
     @Override
     public Variable emitUDiv(Value a, Value b, LIRFrameState state) {
         AMD64MulDivOp op;
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 op = emitDIV(DWORD, a, b, state);
                 break;
@@ -1002,7 +1001,7 @@
     @Override
     public Variable emitURem(Value a, Value b, LIRFrameState state) {
         AMD64MulDivOp op;
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 op = emitDIV(DWORD, a, b, state);
                 break;
@@ -1018,7 +1017,7 @@
     @Override
     public Variable emitAnd(Value a, Value b) {
         LIRKind resultKind = LIRKind.combine(a, b);
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitBinary(resultKind, AND, DWORD, true, a, b, false);
             case Long:
@@ -1035,7 +1034,7 @@
     @Override
     public Variable emitOr(Value a, Value b) {
         LIRKind resultKind = LIRKind.combine(a, b);
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitBinary(resultKind, OR, DWORD, true, a, b, false);
             case Long:
@@ -1052,7 +1051,7 @@
     @Override
     public Variable emitXor(Value a, Value b) {
         LIRKind resultKind = LIRKind.combine(a, b);
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitBinary(resultKind, XOR, DWORD, true, a, b, false);
             case Long:
@@ -1089,7 +1088,7 @@
 
     @Override
     public Variable emitShl(Value a, Value b) {
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitShift(SHL, DWORD, a, b);
             case Long:
@@ -1101,7 +1100,7 @@
 
     @Override
     public Variable emitShr(Value a, Value b) {
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitShift(SAR, DWORD, a, b);
             case Long:
@@ -1113,7 +1112,7 @@
 
     @Override
     public Variable emitUShr(Value a, Value b) {
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitShift(SHR, DWORD, a, b);
             case Long:
@@ -1124,7 +1123,7 @@
     }
 
     public Variable emitRol(Value a, Value b) {
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitShift(ROL, DWORD, a, b);
             case Long:
@@ -1135,7 +1134,7 @@
     }
 
     public Variable emitRor(Value a, Value b) {
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitShift(ROR, DWORD, a, b);
             case Long:
@@ -1228,7 +1227,7 @@
 
     @Override
     public Value emitNarrow(Value inputVal, int bits) {
-        if (inputVal.getKind() == Kind.Long && bits <= 32) {
+        if (inputVal.getPlatformKind() == Kind.Long && bits <= 32) {
             // TODO make it possible to reinterpret Long as Int in LIR without move
             return emitConvertOp(LIRKind.combine(inputVal).changeType(Kind.Int), AMD64RMOp.MOV, DWORD, inputVal);
         } else {
@@ -1274,13 +1273,13 @@
         if (fromBits == toBits) {
             return inputVal;
         } else if (fromBits > 32) {
-            assert inputVal.getKind() == Kind.Long;
+            assert inputVal.getPlatformKind() == Kind.Long;
             Variable result = newVariable(LIRKind.combine(inputVal).changeType(Kind.Long));
             long mask = CodeUtil.mask(fromBits);
             append(new AMD64Binary.DataOp(AND.getRMOpcode(QWORD), QWORD, result, asAllocatable(inputVal), JavaConstant.forLong(mask)));
             return result;
         } else {
-            assert inputVal.getKind().getStackKind() == Kind.Int;
+            assert ((Kind) inputVal.getPlatformKind()).getStackKind() == Kind.Int;
 
             LIRKind resultKind = LIRKind.combine(inputVal);
             if (toBits > 32) {
@@ -1340,10 +1339,10 @@
     @Override
     public Variable emitBitCount(Value value) {
         Variable result = newVariable(LIRKind.combine(value).changeType(Kind.Int));
-        if (value.getKind().getStackKind() == Kind.Int) {
+        if (value.getPlatformKind() == Kind.Long) {
+            append(new AMD64Unary.RMOp(POPCNT, QWORD, result, asAllocatable(value)));
+        } else {
             append(new AMD64Unary.RMOp(POPCNT, DWORD, result, asAllocatable(value)));
-        } else {
-            append(new AMD64Unary.RMOp(POPCNT, QWORD, result, asAllocatable(value)));
         }
         return result;
     }
@@ -1358,30 +1357,30 @@
     @Override
     public Variable emitBitScanReverse(Value value) {
         Variable result = newVariable(LIRKind.combine(value).changeType(Kind.Int));
-        if (value.getKind().getStackKind() == Kind.Int) {
+        if (value.getPlatformKind() == Kind.Long) {
+            append(new AMD64Unary.RMOp(BSR, QWORD, result, asAllocatable(value)));
+        } else {
             append(new AMD64Unary.RMOp(BSR, DWORD, result, asAllocatable(value)));
-        } else {
-            append(new AMD64Unary.RMOp(BSR, QWORD, result, asAllocatable(value)));
         }
         return result;
     }
 
     public Value emitCountLeadingZeros(Value value) {
         Variable result = newVariable(LIRKind.combine(value).changeType(Kind.Int));
-        if (value.getKind().getStackKind() == Kind.Int) {
+        if (value.getPlatformKind() == Kind.Long) {
+            append(new AMD64Unary.RMOp(LZCNT, QWORD, result, asAllocatable(value)));
+        } else {
             append(new AMD64Unary.RMOp(LZCNT, DWORD, result, asAllocatable(value)));
-        } else {
-            append(new AMD64Unary.RMOp(LZCNT, QWORD, result, asAllocatable(value)));
         }
         return result;
     }
 
     public Value emitCountTrailingZeros(Value value) {
         Variable result = newVariable(LIRKind.combine(value).changeType(Kind.Int));
-        if (value.getKind().getStackKind() == Kind.Int) {
+        if (value.getPlatformKind() == Kind.Long) {
+            append(new AMD64Unary.RMOp(TZCNT, QWORD, result, asAllocatable(value)));
+        } else {
             append(new AMD64Unary.RMOp(TZCNT, DWORD, result, asAllocatable(value)));
-        } else {
-            append(new AMD64Unary.RMOp(TZCNT, QWORD, result, asAllocatable(value)));
         }
         return result;
     }
@@ -1389,7 +1388,7 @@
     @Override
     public Value emitMathAbs(Value input) {
         Variable result = newVariable(LIRKind.combine(input));
-        switch (input.getKind()) {
+        switch ((Kind) input.getPlatformKind()) {
             case Float:
                 append(new AMD64Binary.DataOp(SSEOp.AND, PS, result, asAllocatable(input), JavaConstant.forFloat(Float.intBitsToFloat(0x7FFFFFFF)), 16));
                 break;
@@ -1405,7 +1404,7 @@
     @Override
     public Value emitMathSqrt(Value input) {
         Variable result = newVariable(LIRKind.combine(input));
-        switch (input.getKind()) {
+        switch ((Kind) input.getPlatformKind()) {
             case Float:
                 append(new AMD64Unary.RMOp(SSEOp.SQRT, SS, result, asAllocatable(input)));
                 break;
@@ -1473,7 +1472,7 @@
     @Override
     public void emitStrategySwitch(SwitchStrategy strategy, Variable key, LabelRef[] keyTargets, LabelRef defaultTarget) {
         // a temp is needed for loading object constants
-        boolean needsTemp = key.getKind() == Kind.Object;
+        boolean needsTemp = key.getPlatformKind() == Kind.Object;
         append(new StrategySwitchOp(strategy, keyTargets, defaultTarget, key, needsTemp ? newVariable(key.getLIRKind()) : Value.ILLEGAL));
     }
 
--- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java	Tue Sep 08 15:11:16 2015 +0200
@@ -278,11 +278,11 @@
     @Override
     public void emitIntegerTestBranch(Value left, Value right, LabelRef trueDestination, LabelRef falseDestination, double trueDestinationProbability) {
         emitIntegerTest(left, right);
-        append(new BranchOp(ConditionFlag.Equal, trueDestination, falseDestination, left.getKind().getStackKind(), trueDestinationProbability));
+        append(new BranchOp(ConditionFlag.Equal, trueDestination, falseDestination, ((Kind) left.getPlatformKind()).getStackKind(), trueDestinationProbability));
     }
 
     private void emitIntegerTest(Value a, Value b) {
-        assert a.getKind().isNumericInteger();
+        assert ((Kind) a.getPlatformKind()).isNumericInteger();
         if (LIRValueUtil.isVariable(b)) {
             append(new SPARCTestOp(load(b), loadNonConst(a)));
         } else {
@@ -392,7 +392,7 @@
     public Variable emitIntegerTestMove(Value left, Value right, Value trueValue, Value falseValue) {
         emitIntegerTest(left, right);
         Variable result = newVariable(trueValue.getLIRKind());
-        Kind kind = left.getKind().getStackKind();
+        Kind kind = ((Kind) left.getPlatformKind()).getStackKind();
         CC conditionCode;
         switch (kind) {
             case Object:
@@ -449,10 +449,10 @@
     @Override
     public Variable emitBitCount(Value operand) {
         Variable result = newVariable(LIRKind.combine(operand).changeType(Kind.Int));
-        if (operand.getKind().getStackKind() == Kind.Int) {
+        if (operand.getPlatformKind() == Kind.Long) {
+            append(new SPARCBitManipulationOp(LPOPCNT, result, asAllocatable(operand), this));
+        } else {
             append(new SPARCBitManipulationOp(IPOPCNT, result, asAllocatable(operand), this));
-        } else {
-            append(new SPARCBitManipulationOp(LPOPCNT, result, asAllocatable(operand), this));
         }
         return result;
     }
@@ -467,10 +467,10 @@
     @Override
     public Variable emitBitScanReverse(Value operand) {
         Variable result = newVariable(LIRKind.combine(operand).changeType(Kind.Int));
-        if (operand.getKind().getStackKind() == Kind.Int) {
+        if (operand.getPlatformKind() == Kind.Long) {
+            append(new SPARCBitManipulationOp(LBSR, result, asAllocatable(operand), this));
+        } else {
             append(new SPARCBitManipulationOp(IBSR, result, asAllocatable(operand), this));
-        } else {
-            append(new SPARCBitManipulationOp(LBSR, result, asAllocatable(operand), this));
         }
         return result;
     }
@@ -505,7 +505,7 @@
 
     @Override
     public Value emitNegate(Value input) {
-        switch (input.getKind().getStackKind()) {
+        switch (((Kind) input.getPlatformKind()).getStackKind()) {
             case Long:
                 return emitUnary(LNEG, input);
             case Int:
@@ -521,7 +521,7 @@
 
     @Override
     public Value emitNot(Value input) {
-        switch (input.getKind().getStackKind()) {
+        switch (((Kind) input.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitUnary(INOT, input);
             case Long:
@@ -583,7 +583,7 @@
 
     @Override
     public Variable emitAdd(LIRKind resultKind, Value a, Value b, boolean setFlags) {
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitBinary(resultKind, setFlags ? IADDCC : IADD, true, a, b);
             case Long:
@@ -599,7 +599,7 @@
 
     @Override
     public Variable emitSub(LIRKind resultKind, Value a, Value b, boolean setFlags) {
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitBinary(resultKind, setFlags ? ISUBCC : ISUB, false, a, b);
             case Long:
@@ -609,14 +609,14 @@
             case Double:
                 return emitBinary(resultKind, DSUB, false, a, b);
             default:
-                throw JVMCIError.shouldNotReachHere("missing: " + a.getKind());
+                throw JVMCIError.shouldNotReachHere("missing: " + a.getPlatformKind());
         }
     }
 
     @Override
     public Variable emitMul(Value a, Value b, boolean setFlags) {
         LIRKind resultKind = LIRKind.combine(a, b);
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitBinary(resultKind, setFlags ? IMULCC : IMUL, true, a, b);
             case Long:
@@ -632,13 +632,13 @@
             case Double:
                 return emitBinary(resultKind, DMUL, true, a, b);
             default:
-                throw JVMCIError.shouldNotReachHere("missing: " + a.getKind());
+                throw JVMCIError.shouldNotReachHere("missing: " + a.getPlatformKind());
         }
     }
 
     @Override
     public Value emitMulHigh(Value a, Value b) {
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitMulHigh(IMUL, a, b);
             case Long:
@@ -650,7 +650,7 @@
 
     @Override
     public Value emitUMulHigh(Value a, Value b) {
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitMulHigh(IUMUL, a, b);
             case Long:
@@ -670,7 +670,7 @@
     @Override
     public Value emitDiv(Value a, Value b, LIRFrameState state) {
         LIRKind resultKind = LIRKind.combine(a, b);
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitBinary(resultKind, IDIV, false, a, b, state);
             case Long:
@@ -680,7 +680,7 @@
             case Double:
                 return emitBinary(resultKind, DDIV, false, a, b, state);
             default:
-                throw JVMCIError.shouldNotReachHere("missing: " + a.getKind());
+                throw JVMCIError.shouldNotReachHere("missing: " + a.getPlatformKind());
         }
     }
 
@@ -691,7 +691,7 @@
         Variable q2;
         Variable q3;
         Variable q4;
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 append(new RemOp(IREM, result, load(a), loadNonConst(b), state, this));
                 break;
@@ -721,7 +721,7 @@
                 append(new BinaryRegReg(DSUB, result, a, q4));
                 break;
             default:
-                throw JVMCIError.shouldNotReachHere("missing: " + a.getKind());
+                throw JVMCIError.shouldNotReachHere("missing: " + a.getPlatformKind());
         }
         return result;
     }
@@ -729,7 +729,7 @@
     @Override
     public Value emitURem(Value a, Value b, LIRFrameState state) {
         Variable result = newVariable(LIRKind.combine(a, b));
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 append(new RemOp(IUREM, result, load(a), load(b), state, this));
                 break;
@@ -748,7 +748,7 @@
         SPARCArithmetic op;
         Value actualA = a;
         Value actualB = b;
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 op = LUDIV;
                 actualA = emitZeroExtend(actualA, 32, 64);
@@ -766,34 +766,34 @@
     @Override
     public Variable emitAnd(Value a, Value b) {
         LIRKind resultKind = LIRKind.combine(a, b);
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitBinary(resultKind, IAND, true, a, b);
             case Long:
                 return emitBinary(resultKind, LAND, true, a, b);
 
             default:
-                throw JVMCIError.shouldNotReachHere("missing: " + a.getKind());
+                throw JVMCIError.shouldNotReachHere("missing: " + a.getPlatformKind());
         }
     }
 
     @Override
     public Variable emitOr(Value a, Value b) {
         LIRKind resultKind = LIRKind.combine(a, b);
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitBinary(resultKind, IOR, true, a, b);
             case Long:
                 return emitBinary(resultKind, LOR, true, a, b);
             default:
-                throw JVMCIError.shouldNotReachHere("missing: " + a.getKind());
+                throw JVMCIError.shouldNotReachHere("missing: " + a.getPlatformKind());
         }
     }
 
     @Override
     public Variable emitXor(Value a, Value b) {
         LIRKind resultKind = LIRKind.combine(a, b);
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitBinary(resultKind, IXOR, true, a, b);
             case Long:
@@ -815,7 +815,7 @@
 
     @Override
     public Variable emitShl(Value a, Value b) {
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitShift(ISHL, a, b);
             case Long:
@@ -827,7 +827,7 @@
 
     @Override
     public Variable emitShr(Value a, Value b) {
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitShift(ISHR, a, b);
             case Long:
@@ -839,7 +839,7 @@
 
     @Override
     public Variable emitUShr(Value a, Value b) {
-        switch (a.getKind().getStackKind()) {
+        switch (((Kind) a.getPlatformKind()).getStackKind()) {
             case Int:
                 return emitShift(IUSHR, a, b);
             case Long:
@@ -952,7 +952,7 @@
 
     @Override
     public Value emitNarrow(Value inputVal, int bits) {
-        if (inputVal.getKind() == Kind.Long && bits <= 32) {
+        if (inputVal.getPlatformKind() == Kind.Long && bits <= 32) {
             return emitConvert2Op(LIRKind.combine(inputVal).changeType(Kind.Int), L2I, asAllocatable(inputVal));
         } else {
             return inputVal;
@@ -997,13 +997,13 @@
         if (fromBits == toBits) {
             return inputVal;
         } else if (fromBits > 32) {
-            assert inputVal.getKind() == Kind.Long;
+            assert inputVal.getPlatformKind() == Kind.Long;
             Variable result = newVariable(LIRKind.combine(inputVal).changeType(Kind.Long));
             long mask = CodeUtil.mask(fromBits);
             append(new BinaryRegConst(SPARCArithmetic.LAND, result, asAllocatable(inputVal), JavaConstant.forLong(mask), null));
             return result;
         } else {
-            assert inputVal.getKind() == Kind.Int || inputVal.getKind() == Kind.Short || inputVal.getKind() == Kind.Byte || inputVal.getKind() == Kind.Char : inputVal.getKind();
+            assert inputVal.getPlatformKind() == Kind.Int || inputVal.getPlatformKind() == Kind.Short || inputVal.getPlatformKind() == Kind.Byte || inputVal.getPlatformKind() == Kind.Char : inputVal.getPlatformKind();
             Variable result = newVariable(LIRKind.combine(inputVal).changeType(Kind.Int));
             long mask = CodeUtil.mask(fromBits);
             JavaConstant constant = JavaConstant.forInt((int) mask);
@@ -1028,7 +1028,7 @@
 
     @Override
     public AllocatableValue emitReinterpret(LIRKind to, Value inputVal) {
-        Kind from = inputVal.getKind();
+        Kind from = (Kind) inputVal.getPlatformKind();
         AllocatableValue input = asAllocatable(inputVal);
         Variable result = newVariable(to);
         // These cases require a move between CPU and FPU registers:
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/BytecodeLIRBuilder.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/BytecodeLIRBuilder.java	Tue Sep 08 15:11:16 2015 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -41,7 +41,7 @@
 
         Value[] params = new Value[incomingArguments.getArgumentCount()];
         for (int i = 0; i < params.length; i++) {
-            params[i] = LIRGenerator.toStackKind(incomingArguments.getArgument(i));
+            params[i] = incomingArguments.getArgument(i);
             if (ValueUtil.isStackSlot(params[i])) {
                 StackSlot slot = ValueUtil.asStackSlot(params[i]);
                 if (slot.isInCallerFrame() && !gen.getResult().getLIR().hasArgInCallerFrame()) {
@@ -56,7 +56,7 @@
         boolean isStatic = method.isStatic();
         for (int i = 0; i < sig.getParameterCount(!isStatic); i++) {
             Value paramValue = params[i];
-            assert paramValue.getKind() == sig.getParameterKind(i).getStackKind();
+            assert paramValue.getLIRKind().equals(gen.target().getLIRKind(sig.getParameterKind(i).getStackKind()));
             parser.storeLocal(i, gen.emitMove(paramValue));
         }
 
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRBuilder.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRBuilder.java	Tue Sep 08 15:11:16 2015 +0200
@@ -407,7 +407,7 @@
 
         Value[] params = new Value[incomingArguments.getArgumentCount()];
         for (int i = 0; i < params.length; i++) {
-            params[i] = LIRGenerator.toStackKind(incomingArguments.getArgument(i));
+            params[i] = incomingArguments.getArgument(i);
             if (ValueUtil.isStackSlot(params[i])) {
                 StackSlot slot = ValueUtil.asStackSlot(params[i]);
                 if (slot.isInCallerFrame() && !gen.getResult().getLIR().hasArgInCallerFrame()) {
@@ -592,7 +592,7 @@
         int j = 0;
         for (ValueNode arg : arguments) {
             if (arg != null) {
-                AllocatableValue operand = LIRGenerator.toStackKind(invokeCc.getArgument(j));
+                AllocatableValue operand = invokeCc.getArgument(j);
                 gen.emitMove(operand, operand(arg));
                 result[j] = operand;
                 j++;
@@ -630,12 +630,14 @@
                 LabelRef[] keyTargets = new LabelRef[keyCount];
                 JavaConstant[] keyConstants = new JavaConstant[keyCount];
                 double[] keyProbabilities = new double[keyCount];
+                Kind keyKind = x.keyAt(0).getKind();
                 for (int i = 0; i < keyCount; i++) {
                     keyTargets[i] = getLIRBlock(x.keySuccessor(i));
                     keyConstants[i] = x.keyAt(i);
                     keyProbabilities[i] = x.keyProbability(i);
+                    assert keyConstants[i].getKind() == keyKind;
                 }
-                if (value.getKind() != Kind.Int || !x.isSorted()) {
+                if (keyKind != Kind.Int || !x.isSorted()) {
                     // hopefully only a few entries
                     gen.emitStrategySwitch(new SwitchStrategy.SequentialStrategy(keyProbabilities, keyConstants), value, keyTargets, defaultTarget);
                 } else {
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotBytecodeLIRBuilder.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotBytecodeLIRBuilder.java	Tue Sep 08 15:11:16 2015 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -46,7 +46,7 @@
 
         Value[] params = new Value[incomingArguments.getArgumentCount() + 1];
         for (int i = 0; i < params.length - 1; i++) {
-            params[i] = LIRGenerator.toStackKind(incomingArguments.getArgument(i));
+            params[i] = incomingArguments.getArgument(i);
             if (ValueUtil.isStackSlot(params[i])) {
                 StackSlot slot = ValueUtil.asStackSlot(params[i]);
                 if (slot.isInCallerFrame() && !gen.getResult().getLIR().hasArgInCallerFrame()) {
@@ -64,7 +64,7 @@
         boolean isStatic = method.isStatic();
         for (int i = 0; i < sig.getParameterCount(!isStatic); i++) {
             Value paramValue = params[i];
-            assert paramValue.getKind() == sig.getParameterKind(i).getStackKind();
+            assert paramValue.getLIRKind().equals(gen.target().getLIRKind(sig.getParameterKind(i).getStackKind()));
             parser.storeLocal(i, gen.emitMove(paramValue));
         }
     }
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java	Tue Sep 08 15:11:16 2015 +0200
@@ -78,7 +78,7 @@
 
         Value[] params = new Value[incomingArguments.getArgumentCount() + 1];
         for (int i = 0; i < params.length - 1; i++) {
-            params[i] = LIRGenerator.toStackKind(incomingArguments.getArgument(i));
+            params[i] = incomingArguments.getArgument(i);
             if (isStackSlot(params[i])) {
                 StackSlot slot = ValueUtil.asStackSlot(params[i]);
                 if (slot.isInCallerFrame() && !gen.getResult().getLIR().hasArgInCallerFrame()) {
@@ -96,7 +96,7 @@
 
         for (ParameterNode param : graph.getNodes(ParameterNode.TYPE)) {
             Value paramValue = params[param.index()];
-            assert paramValue.getLIRKind().equals(getLIRGeneratorTool().getLIRKind(param.stamp()));
+            assert paramValue.getLIRKind().equals(getLIRGeneratorTool().getLIRKind(param.stamp())) : paramValue.getLIRKind() + " != " + param.stamp();
             setResult(param, gen.emitMove(paramValue));
         }
     }
@@ -173,7 +173,7 @@
 
         RegisterValue raxLocal = AMD64.rax.asValue(expected.getLIRKind());
         gen.emitMove(raxLocal, expected);
-        append(new CompareAndSwapOp(expected.getKind(), raxLocal, getGen().asAddressValue(operand(x.getAddress())), raxLocal, newVal));
+        append(new CompareAndSwapOp((Kind) expected.getPlatformKind(), raxLocal, getGen().asAddressValue(operand(x.getAddress())), raxLocal, newVal));
 
         setResult(x, gen.emitMove(raxLocal));
     }
--- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotJumpToExceptionHandlerOp.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotJumpToExceptionHandlerOp.java	Tue Sep 08 15:11:16 2015 +0200
@@ -54,7 +54,7 @@
 
     @Override
     public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) {
-        Register addrRegister = asLongReg(address);
+        Register addrRegister = asRegister(address, Kind.Long);
         masm.jmp(addrRegister);
         masm.restoreWindow();
     }
--- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java	Tue Sep 08 15:11:16 2015 +0200
@@ -187,7 +187,7 @@
         LIRKind wordKind = LIRKind.value(getProviders().getCodeCache().getTarget().wordKind);
         RegisterValue thread = getProviders().getRegisters().getThreadRegister().asValue(wordKind);
         SPARCAddressValue pendingDeoptAddress = new SPARCImmediateAddressValue(wordKind, thread, offset);
-        append(new StoreOp(v.getKind(), pendingDeoptAddress, load(v), null));
+        append(new StoreOp(v.getPlatformKind(), pendingDeoptAddress, load(v), null));
     }
 
     @Override
--- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotPatchReturnAddressOp.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotPatchReturnAddressOp.java	Tue Sep 08 15:11:16 2015 +0200
@@ -50,7 +50,7 @@
 
     @Override
     public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) {
-        Register addrRegister = asLongReg(address);
+        Register addrRegister = asRegister(address, Kind.Long);
         masm.sub(addrRegister, SPARCAssembler.PC_RETURN_OFFSET, i7);
     }
 }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/ForeignCallStub.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/ForeignCallStub.java	Tue Sep 08 15:11:16 2015 +0200
@@ -197,7 +197,7 @@
     protected StructuredGraph getGraph() {
         WordTypes wordTypes = providers.getWordTypes();
         Class<?>[] args = linkage.getDescriptor().getArgumentTypes();
-        boolean isObjectResult = linkage.getOutgoingCallingConvention().getReturn().getKind() == Kind.Object;
+        boolean isObjectResult = !linkage.getOutgoingCallingConvention().getReturn().getLIRKind().isValue();
 
         StructuredGraph graph = new StructuredGraph(toString(), null, AllowAssumptions.NO);
         graph.disableInlinedMethodRecording();
--- a/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Arithmetic.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Arithmetic.java	Tue Sep 08 15:11:16 2015 +0200
@@ -94,8 +94,8 @@
         @Override
         public void verify() {
             super.verify();
-            assert (opcode.name().startsWith("F") && result.getKind() == Kind.Float && x.getKind() == Kind.Float && y.getKind() == Kind.Float) ||
-                            (opcode.name().startsWith("D") && result.getKind() == Kind.Double && x.getKind() == Kind.Double && y.getKind() == Kind.Double);
+            assert (opcode.name().startsWith("F") && result.getPlatformKind() == Kind.Float && x.getPlatformKind() == Kind.Float && y.getPlatformKind() == Kind.Float) ||
+                            (opcode.name().startsWith("D") && result.getPlatformKind() == Kind.Double && x.getPlatformKind() == Kind.Double && y.getPlatformKind() == Kind.Double);
         }
     }
 }
--- a/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64ArrayEqualsOp.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64ArrayEqualsOp.java	Tue Sep 08 15:11:16 2015 +0200
@@ -154,8 +154,8 @@
     private void emitSSE41Compare(CompilationResultBuilder crb, AMD64MacroAssembler masm, Register result, Register array1, Register array2, Register length, Label trueLabel, Label falseLabel) {
         assert supportsSSE41(crb.target);
 
-        Register vector1 = asDoubleReg(vectorTemp1);
-        Register vector2 = asDoubleReg(vectorTemp2);
+        Register vector1 = asRegister(vectorTemp1, Kind.Double);
+        Register vector2 = asRegister(vectorTemp2, Kind.Double);
 
         Label loop = new Label();
         Label compareTail = new Label();
--- a/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64ByteSwapOp.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64ByteSwapOp.java	Tue Sep 08 15:11:16 2015 +0200
@@ -45,12 +45,12 @@
     @Override
     public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) {
         AMD64Move.move(crb, masm, result, input);
-        switch (input.getKind()) {
+        switch ((Kind) input.getPlatformKind()) {
             case Int:
-                masm.bswapl(ValueUtil.asIntReg(result));
+                masm.bswapl(ValueUtil.asRegister(result, Kind.Int));
                 break;
             case Long:
-                masm.bswapq(ValueUtil.asLongReg(result));
+                masm.bswapq(ValueUtil.asRegister(result, Kind.Long));
         }
     }
 }
--- a/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64ControlFlow.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64ControlFlow.java	Tue Sep 08 15:11:16 2015 +0200
@@ -144,7 +144,7 @@
             this.scratch = scratch;
             assert keyConstants.length == keyTargets.length;
             assert keyConstants.length == strategy.keyProbabilities.length;
-            assert (scratch.getKind() == Kind.Illegal) == (key.getKind() == Kind.Int || key.getKind() == Kind.Long);
+            assert (scratch.getPlatformKind() == Kind.Illegal) == (key.getPlatformKind() == Kind.Int || key.getPlatformKind() == Kind.Long);
         }
 
         @Override
@@ -154,7 +154,7 @@
             BaseSwitchClosure closure = new BaseSwitchClosure(crb, masm, keyTargets, defaultTarget) {
                 @Override
                 protected void conditionalJump(int index, Condition condition, Label target) {
-                    switch (key.getKind()) {
+                    switch (keyConstants[index].getKind()) {
                         case Int:
                             if (crb.codeCache.needsDataPatch(keyConstants[index])) {
                                 crb.recordInlineDataInCode(keyConstants[index]);
@@ -169,7 +169,7 @@
                         case Object:
                             assert condition == Condition.EQ || condition == Condition.NE;
                             AMD64Move.const2reg(crb, masm, scratch, keyConstants[index]);
-                            masm.cmpptr(keyRegister, asObjectReg(scratch));
+                            masm.cmpptr(keyRegister, asRegister(scratch));
                             break;
                         default:
                             throw new JVMCIError("switch only supported for int, long and object");
@@ -202,9 +202,9 @@
 
         @Override
         public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) {
-            Register indexReg = asIntReg(index);
-            Register idxScratchReg = asIntReg(idxScratch);
-            Register scratchReg = asLongReg(scratch);
+            Register indexReg = asRegister(index, Kind.Int);
+            Register idxScratchReg = asRegister(idxScratch, Kind.Int);
+            Register scratchReg = asRegister(scratch, Kind.Long);
 
             if (!indexReg.equals(idxScratchReg)) {
                 masm.movl(idxScratchReg, indexReg);
@@ -342,7 +342,7 @@
     private static void cmove(CompilationResultBuilder crb, AMD64MacroAssembler masm, Value result, ConditionFlag cond, Value other) {
         if (isRegister(other)) {
             assert !asRegister(other).equals(asRegister(result)) : "other already overwritten by previous move";
-            switch (other.getKind()) {
+            switch ((Kind) other.getPlatformKind()) {
                 case Boolean:
                 case Byte:
                 case Short:
@@ -358,7 +358,7 @@
             }
         } else {
             AMD64Address addr = (AMD64Address) crb.asAddress(other);
-            switch (other.getKind()) {
+            switch ((Kind) other.getPlatformKind()) {
                 case Boolean:
                 case Byte:
                 case Short:
--- a/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64MathIntrinsicOp.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64MathIntrinsicOp.java	Tue Sep 08 15:11:16 2015 +0200
@@ -52,11 +52,11 @@
     @Override
     public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) {
         switch (opcode) {
-            case LOG:   masm.flog(asDoubleReg(result), asDoubleReg(input), false); break;
-            case LOG10: masm.flog(asDoubleReg(result), asDoubleReg(input), true); break;
-            case SIN:   masm.fsin(asDoubleReg(result), asDoubleReg(input)); break;
-            case COS:   masm.fcos(asDoubleReg(result), asDoubleReg(input)); break;
-            case TAN:   masm.ftan(asDoubleReg(result), asDoubleReg(input)); break;
+            case LOG:   masm.flog(asRegister(result, Kind.Double), asRegister(input, Kind.Double), false); break;
+            case LOG10: masm.flog(asRegister(result, Kind.Double), asRegister(input, Kind.Double), true); break;
+            case SIN:   masm.fsin(asRegister(result, Kind.Double), asRegister(input, Kind.Double)); break;
+            case COS:   masm.fcos(asRegister(result, Kind.Double), asRegister(input, Kind.Double)); break;
+            case TAN:   masm.ftan(asRegister(result, Kind.Double), asRegister(input, Kind.Double)); break;
             default:    throw JVMCIError.shouldNotReachHere();
         }
     }
--- a/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Move.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Move.java	Tue Sep 08 15:11:16 2015 +0200
@@ -185,12 +185,12 @@
         @Override
         public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) {
             // backup scratch register
-            move(backupSlot.getKind(), crb, masm, backupSlot, scratch.asValue(backupSlot.getLIRKind()));
+            move((Kind) backupSlot.getPlatformKind(), crb, masm, backupSlot, scratch.asValue(backupSlot.getLIRKind()));
             // move stack slot
-            move(getInput().getKind(), crb, masm, scratch.asValue(getInput().getLIRKind()), getInput());
-            move(getResult().getKind(), crb, masm, getResult(), scratch.asValue(getResult().getLIRKind()));
+            move((Kind) getInput().getPlatformKind(), crb, masm, scratch.asValue(getInput().getLIRKind()), getInput());
+            move((Kind) getResult().getPlatformKind(), crb, masm, getResult(), scratch.asValue(getResult().getLIRKind()));
             // restore scratch register
-            move(backupSlot.getKind(), crb, masm, scratch.asValue(backupSlot.getLIRKind()), backupSlot);
+            move((Kind) backupSlot.getPlatformKind(), crb, masm, scratch.asValue(backupSlot.getLIRKind()), backupSlot);
 
         }
     }
@@ -216,16 +216,16 @@
         @Override
         public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) {
             // backup scratch register
-            move(backupSlot.getKind(), crb, masm, backupSlot, scratch.asValue(backupSlot.getLIRKind()));
+            move((Kind) backupSlot.getPlatformKind(), crb, masm, backupSlot, scratch.asValue(backupSlot.getLIRKind()));
             for (int i = 0; i < results.length; i++) {
                 Value input = inputs[i];
                 AllocatableValue result = results[i];
                 // move stack slot
-                move(input.getKind(), crb, masm, scratch.asValue(input.getLIRKind()), input);
-                move(result.getKind(), crb, masm, result, scratch.asValue(result.getLIRKind()));
+                move((Kind) input.getPlatformKind(), crb, masm, scratch.asValue(input.getLIRKind()), input);
+                move((Kind) result.getPlatformKind(), crb, masm, result, scratch.asValue(result.getLIRKind()));
             }
             // restore scratch register
-            move(backupSlot.getKind(), crb, masm, scratch.asValue(backupSlot.getLIRKind()), backupSlot);
+            move((Kind) backupSlot.getPlatformKind(), crb, masm, scratch.asValue(backupSlot.getLIRKind()), backupSlot);
 
         }
     }
@@ -276,7 +276,7 @@
 
         @Override
         public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) {
-            masm.leaq(asLongReg(result), address.toAddress());
+            masm.leaq(asRegister(result, Kind.Long), address.toAddress());
         }
     }
 
@@ -313,7 +313,7 @@
 
         @Override
         public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) {
-            masm.leaq(asLongReg(result), (AMD64Address) crb.asAddress(slot));
+            masm.leaq(asRegister(result, Kind.Long), (AMD64Address) crb.asAddress(slot));
         }
     }
 
@@ -474,7 +474,7 @@
     }
 
     public static void move(CompilationResultBuilder crb, AMD64MacroAssembler masm, Value result, Value input) {
-        move(result.getKind(), crb, masm, result, input);
+        move((Kind) result.getPlatformKind(), crb, masm, result, input);
     }
 
     public static void move(Kind moveKind, CompilationResultBuilder crb, AMD64MacroAssembler masm, Value result, Value input) {
@@ -517,16 +517,16 @@
                 masm.movq(asRegister(result), asRegister(input));
                 break;
             case Float:
-                masm.movflt(asFloatReg(result), asFloatReg(input));
+                masm.movflt(asRegister(result, Kind.Float), asRegister(input, Kind.Float));
                 break;
             case Double:
-                masm.movdbl(asDoubleReg(result), asDoubleReg(input));
+                masm.movdbl(asRegister(result, Kind.Double), asRegister(input, Kind.Double));
                 break;
             case Object:
                 masm.movq(asRegister(result), asRegister(input));
                 break;
             default:
-                throw JVMCIError.shouldNotReachHere("kind=" + result.getKind());
+                throw JVMCIError.shouldNotReachHere("kind=" + result.getPlatformKind());
         }
     }
 
@@ -548,10 +548,10 @@
                 masm.movq(dest, asRegister(input));
                 break;
             case Float:
-                masm.movflt(dest, asFloatReg(input));
+                masm.movflt(dest, asRegister(input, Kind.Float));
                 break;
             case Double:
-                masm.movsd(dest, asDoubleReg(input));
+                masm.movsd(dest, asRegister(input, Kind.Double));
                 break;
             case Object:
                 masm.movq(dest, asRegister(input));
@@ -583,10 +583,10 @@
                 masm.movq(asRegister(result), src);
                 break;
             case Float:
-                masm.movflt(asFloatReg(result), src);
+                masm.movflt(asRegister(result, Kind.Float), src);
                 break;
             case Double:
-                masm.movdbl(asDoubleReg(result), src);
+                masm.movdbl(asRegister(result, Kind.Double), src);
                 break;
             case Object:
                 masm.movq(asRegister(result), src);
@@ -641,18 +641,18 @@
                 // This is *not* the same as 'constant == 0.0f' in the case where constant is -0.0f
                 if (Float.floatToRawIntBits(input.asFloat()) == Float.floatToRawIntBits(0.0f)) {
                     assert !crb.codeCache.needsDataPatch(input);
-                    masm.xorps(asFloatReg(result), asFloatReg(result));
+                    masm.xorps(asRegister(result, Kind.Float), asRegister(result, Kind.Float));
                 } else {
-                    masm.movflt(asFloatReg(result), (AMD64Address) crb.asFloatConstRef(input));
+                    masm.movflt(asRegister(result, Kind.Float), (AMD64Address) crb.asFloatConstRef(input));
                 }
                 break;
             case Double:
                 // This is *not* the same as 'constant == 0.0d' in the case where constant is -0.0d
                 if (Double.doubleToRawLongBits(input.asDouble()) == Double.doubleToRawLongBits(0.0d)) {
                     assert !crb.codeCache.needsDataPatch(input);
-                    masm.xorpd(asDoubleReg(result), asDoubleReg(result));
+                    masm.xorpd(asRegister(result, Kind.Double), asRegister(result, Kind.Double));
                 } else {
-                    masm.movdbl(asDoubleReg(result), (AMD64Address) crb.asDoubleConstRef(input));
+                    masm.movdbl(asRegister(result, Kind.Double), (AMD64Address) crb.asDoubleConstRef(input));
                 }
                 break;
             case Object:
@@ -700,7 +700,7 @@
             default:
                 throw JVMCIError.shouldNotReachHere();
         }
-        switch (result.getKind()) {
+        switch ((Kind) result.getPlatformKind()) {
             case Byte:
                 assert NumUtil.isByte(imm) : "Is not in byte range: " + imm;
                 AMD64MIOp.MOVB.emit(masm, OperandSize.BYTE, dest, (int) imm);
@@ -724,7 +724,7 @@
                 masm.movlong(dest, imm);
                 break;
             default:
-                throw JVMCIError.shouldNotReachHere("Unknown result Kind: " + result.getKind());
+                throw JVMCIError.shouldNotReachHere("Unknown result Kind: " + result.getPlatformKind());
         }
     }
 }
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArithmetic.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArithmetic.java	Tue Sep 08 15:11:16 2015 +0200
@@ -135,7 +135,7 @@
         @Override
         public void verify() {
             super.verify();
-            verifyKind(opcode, result.getKind(), x.getKind(), y.getKind());
+            verifyKind(opcode, result.getPlatformKind(), x.getPlatformKind(), y.getPlatformKind());
         }
 
         @Override
@@ -186,7 +186,7 @@
         @Override
         public void verify() {
             super.verify();
-            verifyKind(opcode, result.getKind(), x.getKind(), y.getKind());
+            verifyKind(opcode, result.getPlatformKind(), x.getPlatformKind(), y.getKind());
         }
     }
 
@@ -224,7 +224,7 @@
         @Override
         public void verify() {
             super.verify();
-            verifyKind(opcode, result.getKind(), x.getKind(), y.getKind());
+            verifyKind(opcode, result.getPlatformKind(), x.getPlatformKind(), y.getPlatformKind());
         }
     }
 
@@ -253,21 +253,21 @@
         @Override
         public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) {
             Label noOverflow = new Label();
-            masm.mulx(asLongReg(x), asLongReg(y), asLongReg(result));
+            masm.mulx(asRegister(x, Kind.Long), asRegister(y, Kind.Long), asRegister(result, Kind.Long));
 
             // Calculate the upper 64 bit signed := (umulxhi product - (x{63}&y + y{63}&x))
-            masm.umulxhi(asLongReg(x), asLongReg(y), asLongReg(scratch1));
-            masm.srax(asLongReg(x), 63, asLongReg(scratch2));
-            masm.and(asLongReg(scratch2), asLongReg(y), asLongReg(scratch2));
-            masm.sub(asLongReg(scratch1), asLongReg(scratch2), asLongReg(scratch1));
+            masm.umulxhi(asRegister(x, Kind.Long), asRegister(y, Kind.Long), asRegister(scratch1, Kind.Long));
+            masm.srax(asRegister(x, Kind.Long), 63, asRegister(scratch2, Kind.Long));
+            masm.and(asRegister(scratch2, Kind.Long), asRegister(y, Kind.Long), asRegister(scratch2, Kind.Long));
+            masm.sub(asRegister(scratch1, Kind.Long), asRegister(scratch2, Kind.Long), asRegister(scratch1, Kind.Long));
 
-            masm.srax(asLongReg(y), 63, asLongReg(scratch2));
-            masm.and(asLongReg(scratch2), asLongReg(x), asLongReg(scratch2));
-            masm.sub(asLongReg(scratch1), asLongReg(scratch2), asLongReg(scratch1));
+            masm.srax(asRegister(y, Kind.Long), 63, asRegister(scratch2, Kind.Long));
+            masm.and(asRegister(scratch2, Kind.Long), asRegister(x, Kind.Long), asRegister(scratch2, Kind.Long));
+            masm.sub(asRegister(scratch1, Kind.Long), asRegister(scratch2, Kind.Long), asRegister(scratch1, Kind.Long));
 
             // Now construct the lower half and compare
-            masm.srax(asLongReg(result), 63, asLongReg(scratch2));
-            masm.cmp(asLongReg(scratch1), asLongReg(scratch2));
+            masm.srax(asRegister(result, Kind.Long), 63, asRegister(scratch2, Kind.Long));
+            masm.cmp(asRegister(scratch1, Kind.Long), asRegister(scratch2, Kind.Long));
             masm.bpcc(Equal, NOT_ANNUL, noOverflow, Xcc, PREDICT_TAKEN);
             masm.nop();
             masm.wrccr(g0, 1 << (CCR_XCC_SHIFT + CCR_V_SHIFT));
@@ -283,88 +283,88 @@
         delaySlotLir.emitControlTransfer(crb, masm);
         switch (opcode) {
             case IADD:
-                masm.add(asIntReg(src1), constant, asIntReg(dst));
+                masm.add(asRegister(src1, Kind.Int), constant, asRegister(dst, Kind.Int));
                 break;
             case IADDCC:
-                masm.addcc(asIntReg(src1), constant, asIntReg(dst));
+                masm.addcc(asRegister(src1, Kind.Int), constant, asRegister(dst, Kind.Int));
                 break;
             case ISUB:
-                masm.sub(asIntReg(src1), constant, asIntReg(dst));
+                masm.sub(asRegister(src1, Kind.Int), constant, asRegister(dst, Kind.Int));
                 break;
             case ISUBCC:
-                masm.subcc(asIntReg(src1), constant, asIntReg(dst));
+                masm.subcc(asRegister(src1, Kind.Int), constant, asRegister(dst, Kind.Int));
                 break;
             case IMUL:
-                masm.mulx(asIntReg(src1), constant, asIntReg(dst));
+                masm.mulx(asRegister(src1, Kind.Int), constant, asRegister(dst, Kind.Int));
                 break;
             case IMULCC:
                 throw JVMCIError.unimplemented();
             case IDIV:
                 masm.sra(asRegister(src1), 0, asRegister(src1));
-                masm.sdivx(asIntReg(src1), constant, asIntReg(dst));
+                masm.sdivx(asRegister(src1, Kind.Int), constant, asRegister(dst, Kind.Int));
                 break;
             case IUDIV:
                 masm.srl(asRegister(src1), 0, asRegister(src1));
-                masm.udivx(asIntReg(src1), constant, asIntReg(dst));
+                masm.udivx(asRegister(src1, Kind.Int), constant, asRegister(dst, Kind.Int));
                 break;
             case IAND:
-                masm.and(asIntReg(src1), constant, asIntReg(dst));
+                masm.and(asRegister(src1, Kind.Int), constant, asRegister(dst, Kind.Int));
                 break;
             case ISHL:
-                masm.sll(asIntReg(src1), constant, asIntReg(dst));
+                masm.sll(asRegister(src1, Kind.Int), constant, asRegister(dst, Kind.Int));
                 break;
             case ISHR:
-                masm.sra(asIntReg(src1), constant, asIntReg(dst));
+                masm.sra(asRegister(src1, Kind.Int), constant, asRegister(dst, Kind.Int));
                 break;
             case IUSHR:
-                masm.srl(asIntReg(src1), constant, asIntReg(dst));
+                masm.srl(asRegister(src1, Kind.Int), constant, asRegister(dst, Kind.Int));
                 break;
             case IOR:
-                masm.or(asIntReg(src1), constant, asIntReg(dst));
+                masm.or(asRegister(src1, Kind.Int), constant, asRegister(dst, Kind.Int));
                 break;
             case IXOR:
-                masm.xor(asIntReg(src1), constant, asIntReg(dst));
+                masm.xor(asRegister(src1, Kind.Int), constant, asRegister(dst, Kind.Int));
                 break;
             case LADD:
-                masm.add(asLongReg(src1), constant, asLongReg(dst));
+                masm.add(asRegister(src1, Kind.Long), constant, asRegister(dst, Kind.Long));
                 break;
             case LADDCC:
-                masm.addcc(asLongReg(src1), constant, asLongReg(dst));
+                masm.addcc(asRegister(src1, Kind.Long), constant, asRegister(dst, Kind.Long));
                 break;
             case LSUB:
-                masm.sub(asLongReg(src1), constant, asLongReg(dst));
+                masm.sub(asRegister(src1, Kind.Long), constant, asRegister(dst, Kind.Long));
                 break;
             case LSUBCC:
-                masm.subcc(asLongReg(src1), constant, asLongReg(dst));
+                masm.subcc(asRegister(src1, Kind.Long), constant, asRegister(dst, Kind.Long));
                 break;
             case LMUL:
-                masm.mulx(asLongReg(src1), constant, asLongReg(dst));
+                masm.mulx(asRegister(src1, Kind.Long), constant, asRegister(dst, Kind.Long));
                 break;
             case LDIV:
                 exceptionOffset = masm.position();
-                masm.sdivx(asLongReg(src1), constant, asLongReg(dst));
+                masm.sdivx(asRegister(src1, Kind.Long), constant, asRegister(dst, Kind.Long));
                 break;
             case LUDIV:
                 exceptionOffset = masm.position();
-                masm.udivx(asLongReg(src1), constant, asLongReg(dst));
+                masm.udivx(asRegister(src1, Kind.Long), constant, asRegister(dst, Kind.Long));
                 break;
             case LAND:
-                masm.and(asLongReg(src1), constant, asLongReg(dst));
+                masm.and(asRegister(src1, Kind.Long), constant, asRegister(dst, Kind.Long));
                 break;
             case LOR:
-                masm.or(asLongReg(src1), constant, asLongReg(dst));
+                masm.or(asRegister(src1, Kind.Long), constant, asRegister(dst, Kind.Long));
                 break;
             case LXOR:
-                masm.xor(asLongReg(src1), constant, asLongReg(dst));
+                masm.xor(asRegister(src1, Kind.Long), constant, asRegister(dst, Kind.Long));
                 break;
             case LSHL:
-                masm.sllx(asLongReg(src1), constant, asLongReg(dst));
+                masm.sllx(asRegister(src1, Kind.Long), constant, asRegister(dst, Kind.Long));
                 break;
             case LSHR:
-                masm.srax(asLongReg(src1), constant, asLongReg(dst));
+                masm.srax(asRegister(src1, Kind.Long), constant, asRegister(dst, Kind.Long));
                 break;
             case LUSHR:
-                masm.srlx(asLongReg(src1), constant, asLongReg(dst));
+                masm.srlx(asRegister(src1, Kind.Long), constant, asRegister(dst, Kind.Long));
                 break;
             case DAND: // Has no constant implementation in SPARC
             case FADD:
@@ -390,30 +390,30 @@
         switch (opcode) {
             case IADD:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.add(asIntReg(src1), asIntReg(src2), asIntReg(dst));
+                masm.add(asRegister(src1, Kind.Int), asRegister(src2, Kind.Int), asRegister(dst, Kind.Int));
                 break;
             case IADDCC:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.addcc(asIntReg(src1), asIntReg(src2), asIntReg(dst));
+                masm.addcc(asRegister(src1, Kind.Int), asRegister(src2, Kind.Int), asRegister(dst, Kind.Int));
                 break;
             case ISUB:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.sub(asIntReg(src1), asIntReg(src2), asIntReg(dst));
+                masm.sub(asRegister(src1, Kind.Int), asRegister(src2, Kind.Int), asRegister(dst, Kind.Int));
                 break;
             case ISUBCC:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.subcc(asIntReg(src1), asIntReg(src2), asIntReg(dst));
+                masm.subcc(asRegister(src1, Kind.Int), asRegister(src2, Kind.Int), asRegister(dst, Kind.Int));
                 break;
             case IMUL:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.mulx(asIntReg(src1), asIntReg(src2), asIntReg(dst));
+                masm.mulx(asRegister(src1, Kind.Int), asRegister(src2, Kind.Int), asRegister(dst, Kind.Int));
                 break;
             case IMULCC:
                 try (ScratchRegister tmpScratch = masm.getScratchRegister()) {
                     Register tmp = tmpScratch.getRegister();
-                    masm.mulx(asIntReg(src1), asIntReg(src2), asIntReg(dst));
+                    masm.mulx(asRegister(src1, Kind.Int), asRegister(src2, Kind.Int), asRegister(dst, Kind.Int));
                     Label noOverflow = new Label();
-                    masm.sra(asIntReg(dst), 0, tmp);
+                    masm.sra(asRegister(dst, Kind.Int), 0, tmp);
                     masm.xorcc(SPARC.g0, SPARC.g0, SPARC.g0);
                     masm.compareBranch(tmp, asRegister(dst), Equal, Xcc, noOverflow, PREDICT_TAKEN, null);
                     masm.wrccr(SPARC.g0, 1 << (SPARCAssembler.CCR_ICC_SHIFT + SPARCAssembler.CCR_V_SHIFT));
@@ -421,146 +421,146 @@
                 }
                 break;
             case IDIV:
-                masm.signx(asIntReg(src1), asIntReg(src1));
-                masm.signx(asIntReg(src2), asIntReg(src2));
+                masm.signx(asRegister(src1, Kind.Int), asRegister(src1, Kind.Int));
+                masm.signx(asRegister(src2, Kind.Int), asRegister(src2, Kind.Int));
                 delaySlotLir.emitControlTransfer(crb, masm);
                 exceptionOffset = masm.position();
-                masm.sdivx(asIntReg(src1), asIntReg(src2), asIntReg(dst));
+                masm.sdivx(asRegister(src1, Kind.Int), asRegister(src2, Kind.Int), asRegister(dst, Kind.Int));
                 break;
             case IUDIV:
-                masm.srl(asIntReg(src1), 0, asIntReg(src1));
-                masm.srl(asIntReg(src2), 0, asIntReg(src2));
+                masm.srl(asRegister(src1, Kind.Int), 0, asRegister(src1, Kind.Int));
+                masm.srl(asRegister(src2, Kind.Int), 0, asRegister(src2, Kind.Int));
                 delaySlotLir.emitControlTransfer(crb, masm);
                 exceptionOffset = masm.position();
-                masm.udivx(asIntReg(src1), asIntReg(src2), asIntReg(dst));
+                masm.udivx(asRegister(src1, Kind.Int), asRegister(src2, Kind.Int), asRegister(dst, Kind.Int));
                 break;
             case IAND:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.and(asIntReg(src1), asIntReg(src2), asIntReg(dst));
+                masm.and(asRegister(src1, Kind.Int), asRegister(src2, Kind.Int), asRegister(dst, Kind.Int));
                 break;
             case IOR:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.or(asIntReg(src1), asIntReg(src2), asIntReg(dst));
+                masm.or(asRegister(src1, Kind.Int), asRegister(src2, Kind.Int), asRegister(dst, Kind.Int));
                 break;
             case IXOR:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.xor(asIntReg(src1), asIntReg(src2), asIntReg(dst));
+                masm.xor(asRegister(src1, Kind.Int), asRegister(src2, Kind.Int), asRegister(dst, Kind.Int));
                 break;
             case ISHL:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.sll(asIntReg(src1), asIntReg(src2), asIntReg(dst));
+                masm.sll(asRegister(src1, Kind.Int), asRegister(src2, Kind.Int), asRegister(dst, Kind.Int));
                 break;
             case ISHR:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.sra(asIntReg(src1), asIntReg(src2), asIntReg(dst));
+                masm.sra(asRegister(src1, Kind.Int), asRegister(src2, Kind.Int), asRegister(dst, Kind.Int));
                 break;
             case IUSHR:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.srl(asIntReg(src1), asIntReg(src2), asIntReg(dst));
+                masm.srl(asRegister(src1, Kind.Int), asRegister(src2, Kind.Int), asRegister(dst, Kind.Int));
                 break;
             case IREM:
                 throw JVMCIError.unimplemented();
             case LADD:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.add(asLongReg(src1), asLongReg(src2), asLongReg(dst));
+                masm.add(asRegister(src1, Kind.Long), asRegister(src2, Kind.Long), asRegister(dst, Kind.Long));
                 break;
             case LADDCC:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.addcc(asLongReg(src1), asLongReg(src2), asLongReg(dst));
+                masm.addcc(asRegister(src1, Kind.Long), asRegister(src2, Kind.Long), asRegister(dst, Kind.Long));
                 break;
             case LSUB:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.sub(asLongReg(src1), asLongReg(src2), asLongReg(dst));
+                masm.sub(asRegister(src1, Kind.Long), asRegister(src2, Kind.Long), asRegister(dst, Kind.Long));
                 break;
             case LSUBCC:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.subcc(asLongReg(src1), asLongReg(src2), asLongReg(dst));
+                masm.subcc(asRegister(src1, Kind.Long), asRegister(src2, Kind.Long), asRegister(dst, Kind.Long));
                 break;
             case LMUL:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.mulx(asLongReg(src1), asLongReg(src2), asLongReg(dst));
+                masm.mulx(asRegister(src1, Kind.Long), asRegister(src2, Kind.Long), asRegister(dst, Kind.Long));
                 break;
             case LMULCC:
                 throw JVMCIError.unimplemented();
             case LDIV:
                 delaySlotLir.emitControlTransfer(crb, masm);
                 exceptionOffset = masm.position();
-                masm.sdivx(asLongReg(src1), asLongReg(src2), asLongReg(dst));
+                masm.sdivx(asRegister(src1, Kind.Long), asRegister(src2, Kind.Long), asRegister(dst, Kind.Long));
                 break;
             case LUDIV:
                 delaySlotLir.emitControlTransfer(crb, masm);
                 exceptionOffset = masm.position();
-                masm.udivx(asLongReg(src1), asLongReg(src2), asLongReg(dst));
+                masm.udivx(asRegister(src1, Kind.Long), asRegister(src2, Kind.Long), asRegister(dst, Kind.Long));
                 break;
             case LAND:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.and(asLongReg(src1), asLongReg(src2), asLongReg(dst));
+                masm.and(asRegister(src1, Kind.Long), asRegister(src2, Kind.Long), asRegister(dst, Kind.Long));
                 break;
             case LOR:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.or(asLongReg(src1), asLongReg(src2), asLongReg(dst));
+                masm.or(asRegister(src1, Kind.Long), asRegister(src2, Kind.Long), asRegister(dst, Kind.Long));
                 break;
             case LXOR:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.xor(asLongReg(src1), asLongReg(src2), asLongReg(dst));
+                masm.xor(asRegister(src1, Kind.Long), asRegister(src2, Kind.Long), asRegister(dst, Kind.Long));
                 break;
             case LSHL:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.sllx(asLongReg(src1), asIntReg(src2), asLongReg(dst));
+                masm.sllx(asRegister(src1, Kind.Long), asRegister(src2, Kind.Int), asRegister(dst, Kind.Long));
                 break;
             case LSHR:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.srax(asLongReg(src1), asIntReg(src2), asLongReg(dst));
+                masm.srax(asRegister(src1, Kind.Long), asRegister(src2, Kind.Int), asRegister(dst, Kind.Long));
                 break;
             case LUSHR:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.srlx(asLongReg(src1), asIntReg(src2), asLongReg(dst));
+                masm.srlx(asRegister(src1, Kind.Long), asRegister(src2, Kind.Int), asRegister(dst, Kind.Long));
                 break;
             case FADD:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.fadds(asFloatReg(src1), asFloatReg(src2), asFloatReg(dst));
+                masm.fadds(asRegister(src1, Kind.Float), asRegister(src2, Kind.Float), asRegister(dst, Kind.Float));
                 break;
             case FSUB:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.fsubs(asFloatReg(src1), asFloatReg(src2), asFloatReg(dst));
+                masm.fsubs(asRegister(src1, Kind.Float), asRegister(src2, Kind.Float), asRegister(dst, Kind.Float));
                 break;
             case FMUL:
                 delaySlotLir.emitControlTransfer(crb, masm);
                 if (dst.getPlatformKind() == Kind.Double) {
-                    masm.fsmuld(asFloatReg(src1), asFloatReg(src2), asDoubleReg(dst));
+                    masm.fsmuld(asRegister(src1, Kind.Float), asRegister(src2, Kind.Float), asRegister(dst, Kind.Double));
                 } else if (dst.getPlatformKind() == Kind.Float) {
-                    masm.fmuls(asFloatReg(src1), asFloatReg(src2), asFloatReg(dst));
+                    masm.fmuls(asRegister(src1, Kind.Float), asRegister(src2, Kind.Float), asRegister(dst, Kind.Float));
                 }
                 break;
             case FDIV:
                 delaySlotLir.emitControlTransfer(crb, masm);
                 exceptionOffset = masm.position();
-                masm.fdivs(asFloatReg(src1), asFloatReg(src2), asFloatReg(dst));
+                masm.fdivs(asRegister(src1, Kind.Float), asRegister(src2, Kind.Float), asRegister(dst, Kind.Float));
                 break;
             case FREM:
                 throw JVMCIError.unimplemented();
             case DADD:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.faddd(asDoubleReg(src1), asDoubleReg(src2), asDoubleReg(dst));
+                masm.faddd(asRegister(src1, Kind.Double), asRegister(src2, Kind.Double), asRegister(dst, Kind.Double));
                 break;
             case DSUB:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.fsubd(asDoubleReg(src1), asDoubleReg(src2), asDoubleReg(dst));
+                masm.fsubd(asRegister(src1, Kind.Double), asRegister(src2, Kind.Double), asRegister(dst, Kind.Double));
                 break;
             case DMUL:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.fmuld(asDoubleReg(src1), asDoubleReg(src2), asDoubleReg(dst));
+                masm.fmuld(asRegister(src1, Kind.Double), asRegister(src2, Kind.Double), asRegister(dst, Kind.Double));
                 break;
             case DDIV:
                 delaySlotLir.emitControlTransfer(crb, masm);
                 exceptionOffset = masm.position();
-                masm.fdivd(asDoubleReg(src1), asDoubleReg(src2), asDoubleReg(dst));
+                masm.fdivd(asRegister(src1, Kind.Double), asRegister(src2, Kind.Double), asRegister(dst, Kind.Double));
                 break;
             case DREM:
                 throw JVMCIError.unimplemented();
             case DAND:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.fandd(asDoubleReg(src1), asDoubleReg(src2), asDoubleReg(dst));
+                masm.fandd(asRegister(src1, Kind.Double), asRegister(src2, Kind.Double), asRegister(dst, Kind.Double));
                 break;
             default:
                 throw JVMCIError.shouldNotReachHere();
@@ -581,26 +581,26 @@
             assert !src2.equals(scratch1);
             switch (opcode) {
                 case IREM:
-                    masm.sra(asIntReg(src1), 0, asIntReg(dst));
+                    masm.sra(asRegister(src1, Kind.Int), 0, asRegister(dst, Kind.Int));
                     exceptionOffset = masm.position();
-                    masm.sdivx(asIntReg(dst), crb.asIntConst(src2), asIntReg(scratch1));
-                    masm.mulx(asIntReg(scratch1), crb.asIntConst(src2), asIntReg(scratch2));
+                    masm.sdivx(asRegister(dst, Kind.Int), crb.asIntConst(src2), asRegister(scratch1, Kind.Int));
+                    masm.mulx(asRegister(scratch1, Kind.Int), crb.asIntConst(src2), asRegister(scratch2, Kind.Int));
                     delaySlotLir.emitControlTransfer(crb, masm);
-                    masm.sub(asIntReg(dst), asIntReg(scratch2), asIntReg(dst));
+                    masm.sub(asRegister(dst, Kind.Int), asRegister(scratch2, Kind.Int), asRegister(dst, Kind.Int));
                     break;
                 case LREM:
                     exceptionOffset = masm.position();
-                    masm.sdivx(asLongReg(src1), crb.asIntConst(src2), asLongReg(scratch1));
-                    masm.mulx(asLongReg(scratch1), crb.asIntConst(src2), asLongReg(scratch2));
+                    masm.sdivx(asRegister(src1, Kind.Long), crb.asIntConst(src2), asRegister(scratch1, Kind.Long));
+                    masm.mulx(asRegister(scratch1, Kind.Long), crb.asIntConst(src2), asRegister(scratch2, Kind.Long));
                     delaySlotLir.emitControlTransfer(crb, masm);
-                    masm.sub(asLongReg(src1), asLongReg(scratch2), asLongReg(dst));
+                    masm.sub(asRegister(src1, Kind.Long), asRegister(scratch2, Kind.Long), asRegister(dst, Kind.Long));
                     break;
                 case LUREM:
                     exceptionOffset = masm.position();
-                    masm.udivx(asLongReg(src1), crb.asIntConst(src2), asLongReg(scratch1));
-                    masm.mulx(asLongReg(scratch1), crb.asIntConst(src2), asLongReg(scratch2));
+                    masm.udivx(asRegister(src1, Kind.Long), crb.asIntConst(src2), asRegister(scratch1, Kind.Long));
+                    masm.mulx(asRegister(scratch1, Kind.Long), crb.asIntConst(src2), asRegister(scratch2, Kind.Long));
                     delaySlotLir.emitControlTransfer(crb, masm);
-                    masm.sub(asLongReg(src1), asLongReg(scratch2), asLongReg(dst));
+                    masm.sub(asRegister(src1, Kind.Long), asRegister(scratch2, Kind.Long), asRegister(dst, Kind.Long));
                     break;
                 case IUREM:
                     JVMCIError.unimplemented();
@@ -613,56 +613,56 @@
             switch (opcode) {
                 case LREM:
                     if (isJavaConstant(src1)) {
-                        new Setx(crb.asLongConst(src1), asLongReg(scratch2), false).emit(masm);
+                        new Setx(crb.asLongConst(src1), asRegister(scratch2, Kind.Long), false).emit(masm);
                         srcLeft = scratch2;
                     }
-                    assert !asLongReg(srcLeft).equals(asLongReg(scratch1));
-                    assert !asLongReg(src2).equals(asLongReg(scratch1));
+                    assert !asRegister(srcLeft, Kind.Long).equals(asRegister(scratch1, Kind.Long));
+                    assert !asRegister(src2, Kind.Long).equals(asRegister(scratch1, Kind.Long));
                     // But src2 can be scratch2
                     exceptionOffset = masm.position();
-                    masm.sdivx(asLongReg(srcLeft), asLongReg(src2), asLongReg(scratch1));
-                    masm.mulx(asLongReg(scratch1), asLongReg(src2), asLongReg(scratch1));
+                    masm.sdivx(asRegister(srcLeft, Kind.Long), asRegister(src2, Kind.Long), asRegister(scratch1, Kind.Long));
+                    masm.mulx(asRegister(scratch1, Kind.Long), asRegister(src2, Kind.Long), asRegister(scratch1, Kind.Long));
                     delaySlotLir.emitControlTransfer(crb, masm);
-                    masm.sub(asLongReg(srcLeft), asLongReg(scratch1), asLongReg(dst));
+                    masm.sub(asRegister(srcLeft, Kind.Long), asRegister(scratch1, Kind.Long), asRegister(dst, Kind.Long));
                     break;
                 case LUREM:
                     if (isJavaConstant(src1)) {
-                        new Setx(crb.asLongConst(src1), asLongReg(scratch2), false).emit(masm);
+                        new Setx(crb.asLongConst(src1), asRegister(scratch2, Kind.Long), false).emit(masm);
                         srcLeft = scratch2;
                     }
-                    assert !asLongReg(srcLeft).equals(asLongReg(scratch1));
-                    assert !asLongReg(src2).equals(asLongReg(scratch1));
+                    assert !asRegister(srcLeft, Kind.Long).equals(asRegister(scratch1, Kind.Long));
+                    assert !asRegister(src2, Kind.Long).equals(asRegister(scratch1, Kind.Long));
                     exceptionOffset = masm.position();
-                    masm.udivx(asLongReg(srcLeft), asLongReg(src2), asLongReg(scratch1));
-                    masm.mulx(asLongReg(scratch1), asLongReg(src2), asLongReg(scratch1));
+                    masm.udivx(asRegister(srcLeft, Kind.Long), asRegister(src2, Kind.Long), asRegister(scratch1, Kind.Long));
+                    masm.mulx(asRegister(scratch1, Kind.Long), asRegister(src2, Kind.Long), asRegister(scratch1, Kind.Long));
                     delaySlotLir.emitControlTransfer(crb, masm);
-                    masm.sub(asLongReg(srcLeft), asLongReg(scratch1), asLongReg(dst));
+                    masm.sub(asRegister(srcLeft, Kind.Long), asRegister(scratch1, Kind.Long), asRegister(dst, Kind.Long));
                     break;
                 case IREM:
                     if (isJavaConstant(src1)) {
-                        new Setx(crb.asIntConst(src1), asIntReg(scratch2), false).emit(masm);
+                        new Setx(crb.asIntConst(src1), asRegister(scratch2, Kind.Int), false).emit(masm);
                         srcLeft = scratch2;
                     }
-                    assert !asIntReg(srcLeft).equals(asIntReg(scratch1));
-                    assert !asIntReg(src2).equals(asIntReg(scratch1));
-                    masm.sra(asIntReg(src1), 0, asIntReg(scratch1));
-                    masm.sra(asIntReg(src2), 0, asIntReg(scratch2));
+                    assert !asRegister(srcLeft, Kind.Int).equals(asRegister(scratch1, Kind.Int));
+                    assert !asRegister(src2, Kind.Int).equals(asRegister(scratch1, Kind.Int));
+                    masm.sra(asRegister(src1, Kind.Int), 0, asRegister(scratch1, Kind.Int));
+                    masm.sra(asRegister(src2, Kind.Int), 0, asRegister(scratch2, Kind.Int));
                     exceptionOffset = masm.position();
-                    masm.sdivx(asIntReg(scratch1), asIntReg(scratch2), asIntReg(dst));
-                    masm.mulx(asIntReg(dst), asIntReg(scratch2), asIntReg(dst));
+                    masm.sdivx(asRegister(scratch1, Kind.Int), asRegister(scratch2, Kind.Int), asRegister(dst, Kind.Int));
+                    masm.mulx(asRegister(dst, Kind.Int), asRegister(scratch2, Kind.Int), asRegister(dst, Kind.Int));
                     delaySlotLir.emitControlTransfer(crb, masm);
-                    masm.sub(asIntReg(scratch1), asIntReg(dst), asIntReg(dst));
+                    masm.sub(asRegister(scratch1, Kind.Int), asRegister(dst, Kind.Int), asRegister(dst, Kind.Int));
                     break;
                 case IUREM:
-                    assert !asIntReg(dst).equals(asIntReg(scratch1));
-                    assert !asIntReg(dst).equals(asIntReg(scratch2));
-                    masm.srl(asIntReg(src1), 0, asIntReg(scratch1));
-                    masm.srl(asIntReg(src2), 0, asIntReg(dst));
+                    assert !asRegister(dst, Kind.Int).equals(asRegister(scratch1, Kind.Int));
+                    assert !asRegister(dst, Kind.Int).equals(asRegister(scratch2, Kind.Int));
+                    masm.srl(asRegister(src1, Kind.Int), 0, asRegister(scratch1, Kind.Int));
+                    masm.srl(asRegister(src2, Kind.Int), 0, asRegister(dst, Kind.Int));
                     exceptionOffset = masm.position();
-                    masm.udivx(asIntReg(scratch1), asIntReg(dst), asIntReg(scratch2));
-                    masm.mulx(asIntReg(scratch2), asIntReg(dst), asIntReg(dst));
+                    masm.udivx(asRegister(scratch1, Kind.Int), asRegister(dst, Kind.Int), asRegister(scratch2, Kind.Int));
+                    masm.mulx(asRegister(scratch2, Kind.Int), asRegister(dst, Kind.Int), asRegister(dst, Kind.Int));
                     delaySlotLir.emitControlTransfer(crb, masm);
-                    masm.sub(asIntReg(scratch1), asIntReg(dst), asIntReg(dst));
+                    masm.sub(asRegister(scratch1, Kind.Int), asRegister(dst, Kind.Int), asRegister(dst, Kind.Int));
                     break;
                 default:
                     throw JVMCIError.shouldNotReachHere();
@@ -682,111 +682,111 @@
         switch (opcode) {
             case INEG:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.neg(asIntReg(src), asIntReg(dst));
+                masm.neg(asRegister(src, Kind.Int), asRegister(dst, Kind.Int));
                 break;
             case LNEG:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.neg(asLongReg(src), asLongReg(dst));
+                masm.neg(asRegister(src, Kind.Long), asRegister(dst, Kind.Long));
                 break;
             case INOT:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.not(asIntReg(src), asIntReg(dst));
+                masm.not(asRegister(src, Kind.Int), asRegister(dst, Kind.Int));
                 break;
             case LNOT:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.not(asLongReg(src), asLongReg(dst));
+                masm.not(asRegister(src, Kind.Long), asRegister(dst, Kind.Long));
                 break;
             case D2F:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.fdtos(asDoubleReg(src), asFloatReg(dst));
+                masm.fdtos(asRegister(src, Kind.Double), asRegister(dst, Kind.Float));
                 break;
             case L2D:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.fxtod(asDoubleReg(src), asDoubleReg(dst));
+                masm.fxtod(asRegister(src, Kind.Double), asRegister(dst, Kind.Double));
                 break;
             case L2F:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.fxtos(asDoubleReg(src), asFloatReg(dst));
+                masm.fxtos(asRegister(src, Kind.Double), asRegister(dst, Kind.Float));
                 break;
             case I2D:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.fitod(asFloatReg(src), asDoubleReg(dst));
+                masm.fitod(asRegister(src, Kind.Float), asRegister(dst, Kind.Double));
                 break;
             case I2L:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.signx(asIntReg(src), asLongReg(dst));
+                masm.signx(asRegister(src, Kind.Int), asRegister(dst, Kind.Long));
                 break;
             case L2I:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.signx(asLongReg(src), asIntReg(dst));
+                masm.signx(asRegister(src, Kind.Long), asRegister(dst, Kind.Int));
                 break;
             case B2L:
-                masm.sll(asIntReg(src), 24, asLongReg(dst));
+                masm.sll(asRegister(src, Kind.Int), 24, asRegister(dst, Kind.Long));
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.sra(asLongReg(dst), 24, asLongReg(dst));
+                masm.sra(asRegister(dst, Kind.Long), 24, asRegister(dst, Kind.Long));
                 break;
             case B2I:
-                masm.sll(asIntReg(src), 24, asIntReg(dst));
+                masm.sll(asRegister(src, Kind.Int), 24, asRegister(dst, Kind.Int));
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.sra(asIntReg(dst), 24, asIntReg(dst));
+                masm.sra(asRegister(dst, Kind.Int), 24, asRegister(dst, Kind.Int));
                 break;
             case S2L:
-                masm.sll(asIntReg(src), 16, asLongReg(dst));
+                masm.sll(asRegister(src, Kind.Int), 16, asRegister(dst, Kind.Long));
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.sra(asLongReg(dst), 16, asLongReg(dst));
+                masm.sra(asRegister(dst, Kind.Long), 16, asRegister(dst, Kind.Long));
                 break;
             case S2I:
-                masm.sll(asIntReg(src), 16, asIntReg(dst));
+                masm.sll(asRegister(src, Kind.Int), 16, asRegister(dst, Kind.Int));
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.sra(asIntReg(dst), 16, asIntReg(dst));
+                masm.sra(asRegister(dst, Kind.Int), 16, asRegister(dst, Kind.Int));
                 break;
             case I2F:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.fitos(asFloatReg(src), asFloatReg(dst));
+                masm.fitos(asRegister(src, Kind.Float), asRegister(dst, Kind.Float));
                 break;
             case F2D:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.fstod(asFloatReg(src), asDoubleReg(dst));
+                masm.fstod(asRegister(src, Kind.Float), asRegister(dst, Kind.Double));
                 break;
             case F2L:
-                masm.fcmp(Fcc0, Fcmps, asFloatReg(src), asFloatReg(src));
+                masm.fcmp(Fcc0, Fcmps, asRegister(src, Kind.Float), asRegister(src, Kind.Float));
                 masm.fbpcc(F_Ordered, ANNUL, notOrdered, Fcc0, PREDICT_TAKEN);
-                masm.fstox(asFloatReg(src), asDoubleReg(dst));
+                masm.fstox(asRegister(src, Kind.Float), asRegister(dst, Kind.Double));
                 masm.fxtod(asRegister(dst), asRegister(dst));
-                masm.fsubd(asDoubleReg(dst), asDoubleReg(dst), asDoubleReg(dst));
+                masm.fsubd(asRegister(dst, Kind.Double), asRegister(dst, Kind.Double), asRegister(dst, Kind.Double));
                 masm.bind(notOrdered);
                 break;
             case F2I:
-                masm.fcmp(Fcc0, Fcmps, asFloatReg(src), asFloatReg(src));
+                masm.fcmp(Fcc0, Fcmps, asRegister(src, Kind.Float), asRegister(src, Kind.Float));
                 masm.fbpcc(F_Ordered, ANNUL, notOrdered, Fcc0, PREDICT_TAKEN);
-                masm.fstoi(asFloatReg(src), asFloatReg(dst));
-                masm.fitos(asFloatReg(dst), asFloatReg(dst));
-                masm.fsubs(asFloatReg(dst), asFloatReg(dst), asFloatReg(dst));
+                masm.fstoi(asRegister(src, Kind.Float), asRegister(dst, Kind.Float));
+                masm.fitos(asRegister(dst, Kind.Float), asRegister(dst, Kind.Float));
+                masm.fsubs(asRegister(dst, Kind.Float), asRegister(dst, Kind.Float), asRegister(dst, Kind.Float));
                 masm.bind(notOrdered);
                 break;
             case D2L:
-                masm.fcmp(Fcc0, Fcmpd, asDoubleReg(src), asDoubleReg(src));
+                masm.fcmp(Fcc0, Fcmpd, asRegister(src, Kind.Double), asRegister(src, Kind.Double));
                 masm.fbpcc(F_Ordered, ANNUL, notOrdered, Fcc0, PREDICT_TAKEN);
-                masm.fdtox(asDoubleReg(src), asDoubleReg(dst));
-                masm.fxtod(asDoubleReg(dst), asDoubleReg(dst));
-                masm.fsubd(asDoubleReg(dst), asDoubleReg(dst), asDoubleReg(dst));
+                masm.fdtox(asRegister(src, Kind.Double), asRegister(dst, Kind.Double));
+                masm.fxtod(asRegister(dst, Kind.Double), asRegister(dst, Kind.Double));
+                masm.fsubd(asRegister(dst, Kind.Double), asRegister(dst, Kind.Double), asRegister(dst, Kind.Double));
                 masm.bind(notOrdered);
                 break;
             case D2I:
-                masm.fcmp(Fcc0, Fcmpd, asDoubleReg(src), asDoubleReg(src));
+                masm.fcmp(Fcc0, Fcmpd, asRegister(src, Kind.Double), asRegister(src, Kind.Double));
                 masm.fbpcc(F_Ordered, ANNUL, notOrdered, Fcc0, PREDICT_TAKEN);
-                masm.fdtoi(asDoubleReg(src), asFloatReg(dst));
-                masm.fitos(asFloatReg(dst), asFloatReg(dst));
-                masm.fsubs(asFloatReg(dst), asFloatReg(dst), asFloatReg(dst));
+                masm.fdtoi(asRegister(src, Kind.Double), asRegister(dst, Kind.Float));
+                masm.fitos(asRegister(dst, Kind.Float), asRegister(dst, Kind.Float));
+                masm.fsubs(asRegister(dst, Kind.Float), asRegister(dst, Kind.Float), asRegister(dst, Kind.Float));
                 masm.bind(notOrdered);
                 break;
             case FNEG:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.fnegs(asFloatReg(src), asFloatReg(dst));
+                masm.fnegs(asRegister(src, Kind.Float), asRegister(dst, Kind.Float));
                 break;
             case DNEG:
                 delaySlotLir.emitControlTransfer(crb, masm);
-                masm.fnegd(asDoubleReg(src), asDoubleReg(dst));
+                masm.fnegd(asRegister(src, Kind.Double), asRegister(dst, Kind.Double));
                 break;
             default:
                 throw JVMCIError.shouldNotReachHere("missing: " + opcode);
@@ -797,7 +797,7 @@
         }
     }
 
-    private static void verifyKind(SPARCArithmetic opcode, Kind result, Kind x, Kind y) {
+    private static void verifyKind(SPARCArithmetic opcode, PlatformKind result, PlatformKind x, PlatformKind y) {
         Kind rk;
         Kind xk;
         Kind yk;
@@ -821,9 +821,9 @@
             case IUSHR:
             case IUDIV:
             case IUREM:
-                rk = result.getStackKind();
-                xsk = x.getStackKind();
-                ysk = y.getStackKind();
+                rk = ((Kind) result).getStackKind();
+                xsk = ((Kind) x).getStackKind();
+                ysk = ((Kind) y).getStackKind();
                 boolean valid = false;
                 for (Kind k : new Kind[]{Kind.Int, Kind.Short, Kind.Byte, Kind.Char}) {
                     valid |= rk == k && xsk == k && ysk == k;
@@ -843,17 +843,17 @@
             case LXOR:
             case LUDIV:
             case LUREM:
-                rk = result;
-                xk = x;
-                yk = y;
+                rk = (Kind) result;
+                xk = (Kind) x;
+                yk = (Kind) y;
                 assert rk == Kind.Long && xk == Kind.Long && yk == Kind.Long;
                 break;
             case LSHL:
             case LSHR:
             case LUSHR:
-                rk = result;
-                xk = x;
-                yk = y;
+                rk = (Kind) result;
+                xk = (Kind) x;
+                yk = (Kind) y;
                 assert rk == Kind.Long && xk == Kind.Long && (yk == Kind.Int || yk == Kind.Long);
                 break;
             case FADD:
@@ -861,9 +861,9 @@
             case FMUL:
             case FDIV:
             case FREM:
-                rk = result;
-                xk = x;
-                yk = y;
+                rk = (Kind) result;
+                xk = (Kind) x;
+                yk = (Kind) y;
                 assert (rk == Kind.Float || rk == Kind.Double) && xk == Kind.Float && yk == Kind.Float;
                 break;
             case DAND:
@@ -872,9 +872,9 @@
             case DMUL:
             case DDIV:
             case DREM:
-                rk = result;
-                xk = x;
-                yk = y;
+                rk = (Kind) result;
+                xk = (Kind) x;
+                yk = (Kind) y;
                 assert rk == Kind.Double && xk == Kind.Double && yk == Kind.Double : "opcode=" + opcode + ", result kind=" + rk + ", x kind=" + xk + ", y kind=" + yk;
                 break;
             default:
@@ -908,30 +908,30 @@
                 case IMUL:
                     masm.sra(asRegister(x), 0, asRegister(x));
                     masm.sra(asRegister(y), 0, asRegister(y));
-                    masm.mulx(asIntReg(x), asIntReg(y), asIntReg(result));
-                    masm.srax(asIntReg(result), 32, asIntReg(result));
+                    masm.mulx(asRegister(x, Kind.Int), asRegister(y, Kind.Int), asRegister(result, Kind.Int));
+                    masm.srax(asRegister(result, Kind.Int), 32, asRegister(result, Kind.Int));
                     break;
                 case IUMUL:
-                    assert !asIntReg(scratch).equals(asIntReg(result));
-                    masm.srl(asIntReg(x), 0, asIntReg(scratch));
-                    masm.srl(asIntReg(y), 0, asIntReg(result));
-                    masm.mulx(asIntReg(result), asIntReg(scratch), asIntReg(result));
-                    masm.srlx(asIntReg(result), 32, asIntReg(result));
+                    assert !asRegister(scratch, Kind.Int).equals(asRegister(result, Kind.Int));
+                    masm.srl(asRegister(x, Kind.Int), 0, asRegister(scratch, Kind.Int));
+                    masm.srl(asRegister(y, Kind.Int), 0, asRegister(result, Kind.Int));
+                    masm.mulx(asRegister(result, Kind.Int), asRegister(scratch, Kind.Int), asRegister(result, Kind.Int));
+                    masm.srlx(asRegister(result, Kind.Int), 32, asRegister(result, Kind.Int));
                     break;
                 case LMUL:
-                    assert !asLongReg(scratch).equals(asLongReg(result));
-                    masm.umulxhi(asLongReg(x), asLongReg(y), asLongReg(result));
+                    assert !asRegister(scratch, Kind.Long).equals(asRegister(result, Kind.Long));
+                    masm.umulxhi(asRegister(x, Kind.Long), asRegister(y, Kind.Long), asRegister(result, Kind.Long));
 
-                    masm.srlx(asLongReg(x), 63, asLongReg(scratch));
-                    masm.mulx(asLongReg(scratch), asLongReg(y), asLongReg(scratch));
-                    masm.sub(asLongReg(result), asLongReg(scratch), asLongReg(result));
+                    masm.srlx(asRegister(x, Kind.Long), 63, asRegister(scratch, Kind.Long));
+                    masm.mulx(asRegister(scratch, Kind.Long), asRegister(y, Kind.Long), asRegister(scratch, Kind.Long));
+                    masm.sub(asRegister(result, Kind.Long), asRegister(scratch, Kind.Long), asRegister(result, Kind.Long));
 
-                    masm.srlx(asLongReg(y), 63, asLongReg(scratch));
-                    masm.mulx(asLongReg(scratch), asLongReg(x), asLongReg(scratch));
-                    masm.sub(asLongReg(result), asLongReg(scratch), asLongReg(result));
+                    masm.srlx(asRegister(y, Kind.Long), 63, asRegister(scratch, Kind.Long));
+                    masm.mulx(asRegister(scratch, Kind.Long), asRegister(x, Kind.Long), asRegister(scratch, Kind.Long));
+                    masm.sub(asRegister(result, Kind.Long), asRegister(scratch, Kind.Long), asRegister(result, Kind.Long));
                     break;
                 case LUMUL:
-                    masm.umulxhi(asLongReg(x), asLongReg(y), asLongReg(result));
+                    masm.umulxhi(asRegister(x, Kind.Long), asRegister(y, Kind.Long), asRegister(result, Kind.Long));
                     break;
                 default:
                     throw JVMCIError.shouldNotReachHere();
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArrayEqualsOp.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArrayEqualsOp.java	Tue Sep 08 15:11:16 2015 +0200
@@ -99,11 +99,11 @@
         Label done = new Label();
 
         // Load array base addresses.
-        masm.add(asObjectReg(array1Value), arrayBaseOffset, array1);
-        masm.add(asObjectReg(array2Value), arrayBaseOffset, array2);
+        masm.add(asRegister(array1Value), arrayBaseOffset, array1);
+        masm.add(asRegister(array2Value), arrayBaseOffset, array2);
 
         // Get array length in bytes.
-        masm.mulx(asIntReg(lengthValue), arrayIndexScale, length);
+        masm.mulx(asRegister(lengthValue, Kind.Int), arrayIndexScale, length);
         masm.mov(length, result); // copy
 
         emit8ByteCompare(masm, result, array1, array2, length, trueLabel, falseLabel);
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCBitManipulationOp.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCBitManipulationOp.java	Tue Sep 08 15:11:16 2015 +0200
@@ -68,7 +68,7 @@
 
     @Override
     public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) {
-        Register dst = asIntReg(result);
+        Register dst = asRegister(result, Kind.Int);
         if (isRegister(input)) {
             Register src = asRegister(input);
             switch (opcode) {
@@ -81,7 +81,7 @@
                     masm.popc(src, dst);
                     break;
                 case BSF:
-                    Kind tkind = input.getKind();
+                    PlatformKind tkind = input.getPlatformKind();
                     if (tkind == Kind.Int) {
                         masm.sub(src, 1, dst);
                         masm.andn(dst, src, dst);
@@ -96,7 +96,7 @@
                     }
                     break;
                 case IBSR: {
-                    Kind ikind = input.getKind();
+                    PlatformKind ikind = input.getPlatformKind();
                     assert ikind == Kind.Int;
                     Register tmp = asRegister(scratch);
                     assert !tmp.equals(dst);
@@ -116,7 +116,7 @@
                     break;
                 }
                 case LBSR: {
-                    Kind lkind = input.getKind();
+                    PlatformKind lkind = input.getPlatformKind();
                     assert lkind == Kind.Long;
                     Register tmp = asRegister(scratch);
                     assert !tmp.equals(dst);
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCByteSwapOp.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCByteSwapOp.java	Tue Sep 08 15:11:16 2015 +0200
@@ -54,19 +54,19 @@
     @Override
     public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) {
         SPARCAddress addr = (SPARCAddress) crb.asAddress(tmpSlot);
-        SPARCMove.emitStore(input, addr, result.getKind(), SPARCDelayedControlTransfer.DUMMY, null, crb, masm);
+        SPARCMove.emitStore(input, addr, result.getPlatformKind(), SPARCDelayedControlTransfer.DUMMY, null, crb, masm);
         if (addr.getIndex().equals(Register.None)) {
-            Register tempReg = ValueUtil.asLongReg(tempIndex);
+            Register tempReg = ValueUtil.asRegister(tempIndex, Kind.Long);
             new SPARCMacroAssembler.Setx(addr.getDisplacement(), tempReg, false).emit(masm);
             addr = new SPARCAddress(addr.getBase(), tempReg);
         }
         getDelayedControlTransfer().emitControlTransfer(crb, masm);
-        switch (input.getKind()) {
+        switch ((Kind) input.getPlatformKind()) {
             case Int:
-                masm.lduwa(addr.getBase(), addr.getIndex(), asIntReg(result), Asi.ASI_PRIMARY_LITTLE);
+                masm.lduwa(addr.getBase(), addr.getIndex(), asRegister(result, Kind.Int), Asi.ASI_PRIMARY_LITTLE);
                 break;
             case Long:
-                masm.ldxa(addr.getBase(), addr.getIndex(), asLongReg(result), Asi.ASI_PRIMARY_LITTLE);
+                masm.ldxa(addr.getBase(), addr.getIndex(), asRegister(result, Kind.Long), Asi.ASI_PRIMARY_LITTLE);
                 break;
             default:
                 throw JVMCIError.shouldNotReachHere();
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCCompare.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCCompare.java	Tue Sep 08 15:11:16 2015 +0200
@@ -66,15 +66,15 @@
         @Override
         public void verify() {
             super.verify();
-            assert CompareBranchOp.SUPPORTED_KINDS.contains(x.getKind()) : x.getKind();
-            assert x.getKind().equals(y.getKind()) : x + " " + y;
+            assert CompareBranchOp.SUPPORTED_KINDS.contains(x.getPlatformKind()) : x.getPlatformKind();
+            assert x.getPlatformKind().equals(y.getPlatformKind()) : x + " " + y;
             // @formatter:off
             assert
-                    (name().startsWith("I") && x.getKind() == Kind.Int && y.getKind().getStackKind() == Kind.Int) ||
-                    (name().startsWith("L") && x.getKind() == Kind.Long && y.getKind() == Kind.Long) ||
-                    (name().startsWith("A") && x.getKind() == Kind.Object && y.getKind() == Kind.Object) ||
-                    (name().startsWith("F") && x.getKind() == Kind.Float && y.getKind() == Kind.Float) ||
-                    (name().startsWith("D") && x.getKind() == Kind.Double && y.getKind() == Kind.Double)
+                    (name().startsWith("I") && x.getPlatformKind() == Kind.Int && ((Kind) y.getPlatformKind()).getStackKind() == Kind.Int) ||
+                    (name().startsWith("L") && x.getPlatformKind() == Kind.Long && y.getPlatformKind() == Kind.Long) ||
+                    (name().startsWith("A") && x.getPlatformKind() == Kind.Object && y.getPlatformKind() == Kind.Object) ||
+                    (name().startsWith("F") && x.getPlatformKind() == Kind.Float && y.getPlatformKind() == Kind.Float) ||
+                    (name().startsWith("D") && x.getPlatformKind() == Kind.Double && y.getPlatformKind() == Kind.Double)
                     : "Name; " + name() + " x: " + x + " y: " + y;
             // @formatter:on
         }
@@ -84,19 +84,19 @@
         if (isRegister(y)) {
             switch (opcode) {
                 case ICMP:
-                    masm.cmp(asIntReg(x), asIntReg(y));
+                    masm.cmp(asRegister(x, Kind.Int), asRegister(y, Kind.Int));
                     break;
                 case LCMP:
-                    masm.cmp(asLongReg(x), asLongReg(y));
+                    masm.cmp(asRegister(x, Kind.Long), asRegister(y, Kind.Long));
                     break;
                 case ACMP:
-                    masm.cmp(asObjectReg(x), asObjectReg(y));
+                    masm.cmp(asRegister(x), asRegister(y));
                     break;
                 case FCMP:
-                    masm.fcmp(Fcc0, Fcmps, asFloatReg(x), asFloatReg(y));
+                    masm.fcmp(Fcc0, Fcmps, asRegister(x, Kind.Float), asRegister(y, Kind.Float));
                     break;
                 case DCMP:
-                    masm.fcmp(Fcc0, Fcmpd, asDoubleReg(x), asDoubleReg(y));
+                    masm.fcmp(Fcc0, Fcmpd, asRegister(x, Kind.Double), asRegister(y, Kind.Double));
                     break;
                 default:
                     throw JVMCIError.shouldNotReachHere();
@@ -106,24 +106,24 @@
             switch (opcode) {
                 case LCMP:
                     assert isSimm13(crb.asLongConst(y));
-                    masm.cmp(asLongReg(x), (int) crb.asLongConst(y));
+                    masm.cmp(asRegister(x, Kind.Long), (int) crb.asLongConst(y));
                     break;
                 case ICMP:
                     assert isSimm13(crb.asIntConst(y));
-                    masm.cmp(asIntReg(x), crb.asIntConst(y));
+                    masm.cmp(asRegister(x, Kind.Int), crb.asIntConst(y));
                     break;
                 case ACMP:
                     if (asJavaConstant(y).isNull()) {
-                        masm.cmp(asObjectReg(x), 0);
+                        masm.cmp(asRegister(x), 0);
                         break;
                     } else {
                         throw JVMCIError.shouldNotReachHere("Only null object constants are allowed in comparisons");
                     }
                 case FCMP:
-                    masm.fcmp(Fcc0, Fcmps, asFloatReg(x), asFloatReg(y));
+                    masm.fcmp(Fcc0, Fcmps, asRegister(x, Kind.Float), asRegister(y, Kind.Float));
                     break;
                 case DCMP:
-                    masm.fcmp(Fcc0, Fcmpd, asDoubleReg(x), asDoubleReg(y));
+                    masm.fcmp(Fcc0, Fcmpd, asRegister(x, Kind.Double), asRegister(y, Kind.Double));
                     break;
                 default:
                     throw JVMCIError.shouldNotReachHere();
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java	Tue Sep 08 15:11:16 2015 +0200
@@ -239,26 +239,26 @@
                 case Int:
                     if (isJavaConstant(actualY)) {
                         int constantY = asJavaConstant(actualY).asInt();
-                        CBCOND.emit(masm, conditionFlag, false, asIntReg(actualX), constantY, actualTrueTarget);
+                        CBCOND.emit(masm, conditionFlag, false, asRegister(actualX, Kind.Int), constantY, actualTrueTarget);
                     } else {
-                        CBCOND.emit(masm, conditionFlag, false, asIntReg(actualX), asIntReg(actualY), actualTrueTarget);
+                        CBCOND.emit(masm, conditionFlag, false, asRegister(actualX, Kind.Int), asRegister(actualY, Kind.Int), actualTrueTarget);
                     }
                     break;
                 case Long:
                     if (isJavaConstant(actualY)) {
                         int constantY = (int) asJavaConstant(actualY).asLong();
-                        CBCOND.emit(masm, conditionFlag, true, asLongReg(actualX), constantY, actualTrueTarget);
+                        CBCOND.emit(masm, conditionFlag, true, asRegister(actualX, Kind.Long), constantY, actualTrueTarget);
                     } else {
-                        CBCOND.emit(masm, conditionFlag, true, asLongReg(actualX), asLongReg(actualY), actualTrueTarget);
+                        CBCOND.emit(masm, conditionFlag, true, asRegister(actualX, Kind.Long), asRegister(actualY, Kind.Long), actualTrueTarget);
                     }
                     break;
                 case Object:
                     if (isJavaConstant(actualY)) {
                         // Object constant valid can only be null
                         assert asJavaConstant(actualY).isNull();
-                        CBCOND.emit(masm, conditionFlag, true, asObjectReg(actualX), 0, actualTrueTarget);
+                        CBCOND.emit(masm, conditionFlag, true, asRegister(actualX), 0, actualTrueTarget);
                     } else { // this is already loaded
-                        CBCOND.emit(masm, conditionFlag, true, asObjectReg(actualX), asObjectReg(actualY), actualTrueTarget);
+                        CBCOND.emit(masm, conditionFlag, true, asRegister(actualX), asRegister(actualY), actualTrueTarget);
                     }
                     break;
                 default:
@@ -303,7 +303,7 @@
         public void verify() {
             super.verify();
             assert SUPPORTED_KINDS.contains(kind) : kind;
-            assert x.getKind().equals(kind) && y.getKind().equals(kind) : x + " " + y;
+            assert x.getPlatformKind().equals(kind) && y.getPlatformKind().equals(kind) : x + " " + y;
         }
     }
 
@@ -454,7 +454,7 @@
                     JavaConstant constant = keyConstants[index];
                     CC conditionCode;
                     Long bits;
-                    switch (key.getKind()) {
+                    switch (constant.getKind()) {
                         case Char:
                         case Byte:
                         case Short:
@@ -548,8 +548,8 @@
 
         @Override
         public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) {
-            Register value = asIntReg(index);
-            Register scratchReg = asLongReg(scratch);
+            Register value = asRegister(index, Kind.Int);
+            Register scratchReg = asRegister(scratch, Kind.Long);
 
             // Compare index against jump table bounds
             int highKey = lowKey + targets.length - 1;
@@ -649,17 +649,17 @@
         public SizeEstimate estimateSize() {
             int constantSize = 0;
             if (isJavaConstant(trueValue) && !SPARCAssembler.isSimm13(asJavaConstant(trueValue))) {
-                constantSize += trueValue.getKind().getByteCount();
+                constantSize += trueValue.getPlatformKind().getSizeInBytes();
             }
             if (isJavaConstant(falseValue) && !SPARCAssembler.isSimm13(asJavaConstant(falseValue))) {
-                constantSize += trueValue.getKind().getByteCount();
+                constantSize += trueValue.getPlatformKind().getSizeInBytes();
             }
             return SizeEstimate.create(3, constantSize);
         }
     }
 
     private static void cmove(SPARCMacroAssembler masm, CC cc, Value result, ConditionFlag cond, Value other) {
-        switch (other.getKind()) {
+        switch ((Kind) other.getPlatformKind()) {
             case Boolean:
             case Byte:
             case Short:
@@ -692,10 +692,10 @@
                 }
                 break;
             case Float:
-                masm.fmovscc(cond, cc, asFloatReg(other), asFloatReg(result));
+                masm.fmovscc(cond, cc, asRegister(other, Kind.Float), asRegister(result, Kind.Float));
                 break;
             case Double:
-                masm.fmovdcc(cond, cc, asDoubleReg(other), asDoubleReg(result));
+                masm.fmovdcc(cond, cc, asRegister(other, Kind.Double), asRegister(result, Kind.Double));
                 break;
             default:
                 throw JVMCIError.shouldNotReachHere();
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMathIntrinsicOp.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMathIntrinsicOp.java	Tue Sep 08 15:11:16 2015 +0200
@@ -58,10 +58,10 @@
             case SQRT:
                 switch (inputKind) {
                     case Float:
-                        masm.fsqrts(asFloatReg(input), asFloatReg(result));
+                        masm.fsqrts(asRegister(input, Kind.Float), asRegister(result, Kind.Float));
                         break;
                     case Double:
-                        masm.fsqrtd(asDoubleReg(input), asDoubleReg(result));
+                        masm.fsqrtd(asRegister(input, Kind.Double), asRegister(result, Kind.Double));
                         break;
                     default:
                         JVMCIError.shouldNotReachHere();
@@ -70,10 +70,10 @@
             case ABS:
                 switch (inputKind) {
                     case Float:
-                        masm.fabss(asFloatReg(input), asFloatReg(result));
+                        masm.fabss(asRegister(input, Kind.Float), asRegister(result, Kind.Float));
                         break;
                     case Double:
-                        masm.fabsd(asDoubleReg(input), asDoubleReg(result));
+                        masm.fabsd(asRegister(input, Kind.Double), asRegister(result, Kind.Double));
                         break;
                     default:
                         JVMCIError.shouldNotReachHere();
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java	Tue Sep 08 15:11:16 2015 +0200
@@ -189,25 +189,25 @@
             getDelayedControlTransfer().emitControlTransfer(crb, masm);
             if (resultKind == Float) {
                 if (inputKind == Int || inputKind == Short || inputKind == Char || inputKind == Byte) {
-                    masm.movwtos(asIntReg(input), asFloatReg(result));
+                    masm.movwtos(asRegister(input, Kind.Int), asRegister(result, Kind.Float));
                 } else {
                     throw JVMCIError.shouldNotReachHere();
                 }
             } else if (resultKind == Double) {
                 if (inputKind == Int || inputKind == Short || inputKind == Char || inputKind == Byte) {
-                    masm.movxtod(asIntReg(input), asDoubleReg(result));
+                    masm.movxtod(asRegister(input, Kind.Int), asRegister(result, Kind.Double));
                 } else {
-                    masm.movxtod(asLongReg(input), asDoubleReg(result));
+                    masm.movxtod(asRegister(input, Kind.Long), asRegister(result, Kind.Double));
                 }
             } else if (inputKind == Float) {
                 if (resultKind == Int || resultKind == Short || resultKind == Byte) {
-                    masm.movstosw(asFloatReg(input), asIntReg(result));
+                    masm.movstosw(asRegister(input, Kind.Float), asRegister(result, Kind.Int));
                 } else {
-                    masm.movstouw(asFloatReg(input), asIntReg(result));
+                    masm.movstouw(asRegister(input, Kind.Float), asRegister(result, Kind.Int));
                 }
             } else if (inputKind == Double) {
                 if (resultKind == Long) {
-                    masm.movdtox(asDoubleReg(input), asLongReg(result));
+                    masm.movdtox(asRegister(input, Kind.Double), asRegister(result, Kind.Long));
                 } else {
                     throw JVMCIError.shouldNotReachHere();
                 }
@@ -297,7 +297,7 @@
         @Override
         public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) {
             SPARCAddress address = addressValue.toAddress();
-            loadEffectiveAddress(crb, masm, address, asLongReg(result), getDelayedControlTransfer());
+            loadEffectiveAddress(crb, masm, address, asRegister(result, Kind.Long), getDelayedControlTransfer());
         }
     }
 
@@ -424,7 +424,7 @@
         @Override
         public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) {
             SPARCAddress address = (SPARCAddress) crb.asAddress(slot);
-            loadEffectiveAddress(crb, masm, address, asLongReg(result), getDelayedControlTransfer());
+            loadEffectiveAddress(crb, masm, address, asRegister(result, Kind.Long), getDelayedControlTransfer());
         }
     }
 
@@ -688,7 +688,7 @@
     protected static void compareAndSwap(CompilationResultBuilder crb, SPARCMacroAssembler masm, AllocatableValue address, AllocatableValue cmpValue, AllocatableValue newValue,
                     SPARCDelayedControlTransfer delay) {
         delay.emitControlTransfer(crb, masm);
-        switch (cmpValue.getKind()) {
+        switch ((Kind) cmpValue.getPlatformKind()) {
             case Int:
                 masm.cas(asRegister(address), asRegister(cmpValue), asRegister(newValue));
                 break;
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCTestOp.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCTestOp.java	Tue Sep 08 15:11:16 2015 +0200
@@ -49,31 +49,31 @@
     @Override
     public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) {
         if (isRegister(y)) {
-            switch (x.getKind()) {
+            switch ((Kind) x.getPlatformKind()) {
                 case Short:
                 case Byte:
                 case Char:
                 case Boolean:
                 case Int:
-                    masm.andcc(asIntReg(x), asIntReg(y), g0);
+                    masm.andcc(asRegister(x, Kind.Int), asRegister(y, Kind.Int), g0);
                     break;
                 case Long:
-                    masm.andcc(asLongReg(x), asLongReg(y), g0);
+                    masm.andcc(asRegister(x, Kind.Long), asRegister(y, Kind.Long), g0);
                     break;
                 default:
                     throw JVMCIError.shouldNotReachHere();
             }
         } else if (isJavaConstant(y)) {
-            switch (x.getKind()) {
+            switch ((Kind) x.getPlatformKind()) {
                 case Short:
                 case Byte:
                 case Char:
                 case Boolean:
                 case Int:
-                    masm.andcc(asIntReg(x), crb.asIntConst(y), g0);
+                    masm.andcc(asRegister(x, Kind.Int), crb.asIntConst(y), g0);
                     break;
                 case Long:
-                    masm.andcc(asLongReg(x), crb.asIntConst(y), g0);
+                    masm.andcc(asRegister(x, Kind.Long), crb.asIntConst(y), g0);
                     break;
                 default:
                     throw JVMCIError.shouldNotReachHere();
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/lsra/LinearScanIntervalDumper.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/lsra/LinearScanIntervalDumper.java	Tue Sep 08 15:11:16 2015 +0200
@@ -47,7 +47,7 @@
         Value hint = interval.locationHint(false) != null ? interval.locationHint(false).operand : null;
         AllocatableValue operand = interval.operand;
         String type = isRegister(operand) ? "fixed" : operand.getLIRKind().getPlatformKind().toString();
-        char typeChar = operand.getKind().getTypeChar();
+        char typeChar = operand.getPlatformKind().getTypeChar();
         visitor.visitIntervalStart(interval.splitParent().operand, operand, interval.location(), hint, type, typeChar);
 
         // print ranges
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/lsra/LinearScanLifetimeAnalysisPhase.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/lsra/LinearScanLifetimeAnalysisPhase.java	Tue Sep 08 15:11:16 2015 +0200
@@ -316,7 +316,7 @@
                             /*
                              * liveIn(block) is the union of liveGen(block) with (liveOut(block) &
                              * !liveKill(block)).
-                             * 
+                             *
                              * Note: liveIn has to be computed only in first iteration or if liveOut
                              * has changed!
                              */
@@ -634,7 +634,7 @@
          * Object method arguments that are passed on the stack are currently not optimized because
          * this requires that the runtime visits method arguments during stack walking.
          */
-        return isStackSlot(value) && asStackSlot(value).isInCallerFrame() && value.getKind() != Kind.Object;
+        return isStackSlot(value) && asStackSlot(value).isInCallerFrame() && value.getLIRKind().isValue();
     }
 
     /**
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceIntervalDumper.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceIntervalDumper.java	Tue Sep 08 15:11:16 2015 +0200
@@ -53,7 +53,7 @@
         Value hint = null;
         AllocatableValue operand = interval.operand;
         String type = "fixed";
-        char typeChar = operand.getKind().getTypeChar();
+        char typeChar = operand.getPlatformKind().getTypeChar();
         visitor.visitIntervalStart(operand, operand, operand, hint, type, typeChar);
 
         // print ranges
@@ -71,7 +71,7 @@
         Value hint = interval.locationHint(false) != null ? interval.locationHint(false).location() : null;
         AllocatableValue operand = interval.operand;
         String type = isRegister(operand) ? "fixed" : operand.getLIRKind().getPlatformKind().toString();
-        char typeChar = operand.getKind().getTypeChar();
+        char typeChar = operand.getPlatformKind().getTypeChar();
         visitor.visitIntervalStart(interval.splitParent().operand, operand, interval.location(), hint, type, typeChar);
 
         // print ranges
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceLinearScanLifetimeAnalysisPhase.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceLinearScanLifetimeAnalysisPhase.java	Tue Sep 08 15:11:16 2015 +0200
@@ -347,7 +347,7 @@
                             /*
                              * liveIn(block) is the union of liveGen(block) with (liveOut(block) &
                              * !liveKill(block)).
-                             * 
+                             *
                              * Note: liveIn has to be computed only in first iteration or if liveOut
                              * has changed!
                              */
@@ -738,7 +738,7 @@
          * Object method arguments that are passed on the stack are currently not optimized because
          * this requires that the runtime visits method arguments during stack walking.
          */
-        return isStackSlot(value) && asStackSlot(value).isInCallerFrame() && value.getKind() != Kind.Object;
+        return isStackSlot(value) && asStackSlot(value).isInCallerFrame() && value.getLIRKind().isValue();
     }
 
     /**
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/asm/CompilationResultBuilder.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/asm/CompilationResultBuilder.java	Tue Sep 08 15:11:16 2015 +0200
@@ -216,7 +216,7 @@
      * including long constants that fit into the 32-bit range.
      */
     public int asIntConst(Value value) {
-        assert (value.getKind().isNumericInteger()) && isJavaConstant(value);
+        assert isJavaConstant(value) && asJavaConstant(value).getKind().isNumericInteger();
         JavaConstant constant = asJavaConstant(value);
         assert !codeCache.needsDataPatch(constant) : constant + " should be in a DataPatch";
         long c = constant.asLong();
@@ -230,7 +230,7 @@
      * Returns the float value of any constant that can be represented by a 32-bit float value.
      */
     public float asFloatConst(Value value) {
-        assert (value.getKind().getStackKind() == Kind.Float && isJavaConstant(value));
+        assert isJavaConstant(value) && asJavaConstant(value).getKind() == Kind.Float;
         JavaConstant constant = asJavaConstant(value);
         assert !codeCache.needsDataPatch(constant) : constant + " should be in a DataPatch";
         return constant.asFloat();
@@ -240,7 +240,7 @@
      * Returns the long value of any constant that can be represented by a 64-bit long value.
      */
     public long asLongConst(Value value) {
-        assert (value.getKind().getStackKind() == Kind.Long && isJavaConstant(value));
+        assert isJavaConstant(value) && asJavaConstant(value).getKind() == Kind.Long;
         JavaConstant constant = asJavaConstant(value);
         assert !codeCache.needsDataPatch(constant) : constant + " should be in a DataPatch";
         return constant.asLong();
@@ -250,7 +250,7 @@
      * Returns the double value of any constant that can be represented by a 64-bit float value.
      */
     public double asDoubleConst(Value value) {
-        assert (value.getKind().getStackKind() == Kind.Double && isJavaConstant(value));
+        assert isJavaConstant(value) && asJavaConstant(value).getKind() == Kind.Double;
         JavaConstant constant = asJavaConstant(value);
         assert !codeCache.needsDataPatch(constant) : constant + " should be in a DataPatch";
         return constant.asDouble();
@@ -297,37 +297,32 @@
     }
 
     public AbstractAddress asByteAddr(Value value) {
-        assert value.getKind().getByteCount() >= Kind.Byte.getByteCount();
+        assert value.getPlatformKind().getSizeInBytes() >= Kind.Byte.getByteCount();
         return asAddress(value);
     }
 
     public AbstractAddress asShortAddr(Value value) {
-        assert value.getKind().getByteCount() >= Kind.Short.getByteCount();
+        assert value.getPlatformKind().getSizeInBytes() >= Kind.Short.getByteCount();
         return asAddress(value);
     }
 
     public AbstractAddress asIntAddr(Value value) {
-        assert value.getKind().getByteCount() >= Kind.Int.getByteCount();
+        assert value.getPlatformKind().getSizeInBytes() >= Kind.Int.getByteCount();
         return asAddress(value);
     }
 
     public AbstractAddress asLongAddr(Value value) {
-        assert value.getKind().getByteCount() >= Kind.Long.getByteCount();
-        return asAddress(value);
-    }
-
-    public AbstractAddress asObjectAddr(Value value) {
-        assert value.getKind() == Kind.Object;
+        assert value.getPlatformKind().getSizeInBytes() >= Kind.Long.getByteCount();
         return asAddress(value);
     }
 
     public AbstractAddress asFloatAddr(Value value) {
-        assert value.getKind().getByteCount() >= Kind.Float.getByteCount();
+        assert value.getPlatformKind().getSizeInBytes() >= Kind.Float.getByteCount();
         return asAddress(value);
     }
 
     public AbstractAddress asDoubleAddr(Value value) {
-        assert value.getKind().getByteCount() >= Kind.Double.getByteCount();
+        assert value.getPlatformKind().getSizeInBytes() >= Kind.Double.getByteCount();
         return asAddress(value);
     }
 
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGenerator.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGenerator.java	Tue Sep 08 15:11:16 2015 +0200
@@ -283,22 +283,6 @@
      */
     protected abstract void emitForeignCallOp(ForeignCallLinkage linkage, Value result, Value[] arguments, Value[] temps, LIRFrameState info);
 
-    public static AllocatableValue toStackKind(AllocatableValue value) {
-        if (value.getKind().getStackKind() != value.getKind()) {
-            // We only have stack-kinds in the LIR, so convert the operand kind for values from the
-            // calling convention.
-            LIRKind stackKind = value.getLIRKind().changeType(value.getKind().getStackKind());
-            if (isRegister(value)) {
-                return asRegister(value).asValue(stackKind);
-            } else if (isStackSlot(value)) {
-                return StackSlot.get(stackKind, asStackSlot(value).getRawOffset(), asStackSlot(value).getRawAddFrameSize());
-            } else {
-                throw JVMCIError.shouldNotReachHere();
-            }
-        }
-        return value;
-    }
-
     @Override
     public Variable emitForeignCall(ForeignCallLinkage linkage, LIRFrameState frameState, Value... args) {
         LIRFrameState state = null;
@@ -436,6 +420,10 @@
 
     // automatic derived reference handling
 
+    protected boolean isNumericInteger(PlatformKind kind) {
+        return ((Kind) kind).isNumericInteger();
+    }
+
     protected abstract Variable emitAdd(LIRKind resultKind, Value a, Value b, boolean setFlags);
 
     public final Variable emitAdd(Value aVal, Value bVal, boolean setFlags) {
@@ -443,7 +431,7 @@
         Value a = aVal;
         Value b = bVal;
 
-        if (a.getKind().isNumericInteger()) {
+        if (isNumericInteger(a.getPlatformKind())) {
             LIRKind aKind = a.getLIRKind();
             LIRKind bKind = b.getLIRKind();
             assert a.getPlatformKind() == b.getPlatformKind();
@@ -487,7 +475,7 @@
         Value a = aVal;
         Value b = bVal;
 
-        if (a.getKind().isNumericInteger()) {
+        if (isNumericInteger(a.getPlatformKind())) {
             LIRKind aKind = a.getLIRKind();
             LIRKind bKind = b.getLIRKind();
             assert a.getPlatformKind() == b.getPlatformKind();
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/stackslotalloc/StackIntervalDumper.java	Tue Sep 08 12:16:00 2015 +0200
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/stackslotalloc/StackIntervalDumper.java	Tue Sep 08 15:11:16 2015 +0200
@@ -46,7 +46,7 @@
         Value hint = interval.locationHint() != null ? interval.locationHint().getOperand() : null;
         VirtualStackSlot operand = interval.getOperand();
         String type = operand.getLIRKind().getPlatformKind().toString();
-        char typeChar = operand.getKind().getTypeChar();
+        char typeChar = operand.getPlatformKind().getTypeChar();
         visitor.visitIntervalStart(operand, operand, interval.location(), hint, type, typeChar);
 
         // print ranges
--- a/mx.graal/suite.py	Tue Sep 08 12:16:00 2015 +0200
+++ b/mx.graal/suite.py	Tue Sep 08 15:11:16 2015 +0200
@@ -6,7 +6,7 @@
     "suites": [
             {
                "name" : "jvmci",
-               "version" : "952d4d634a4251e2c873bda403446ae051d50ad9",
+               "version" : "df053711614bbad30c2b885f7a49ee1d7f0c180d",
                "urls" : [
                     {"url" : "http://lafo.ssw.uni-linz.ac.at/hg/graal-jvmci-8", "kind" : "hg"},
                     {"url" : "https://curio.ssw.jku.at/nexus/content/repositories/snapshots", "kind" : "binary"},