changeset 21438:a4f376f516dc

AMD64Move: refactor #const2stack and add support for short and byte.
author Josef Eisl <josef.eisl@jku.at>
date Wed, 20 May 2015 17:30:34 +0200
parents 3c66c48a28f3
children 3ea8e7e75625
files graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Move.java
diffstat 1 files changed, 31 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Move.java	Wed May 20 16:30:05 2015 +0200
+++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Move.java	Wed May 20 17:30:34 2015 +0200
@@ -30,7 +30,10 @@
 import com.oracle.graal.amd64.*;
 import com.oracle.graal.api.code.*;
 import com.oracle.graal.api.meta.*;
+import com.oracle.graal.asm.*;
 import com.oracle.graal.asm.amd64.*;
+import com.oracle.graal.asm.amd64.AMD64Assembler.AMD64MIOp;
+import com.oracle.graal.asm.amd64.AMD64Assembler.OperandSize;
 import com.oracle.graal.compiler.common.*;
 import com.oracle.graal.lir.*;
 import com.oracle.graal.lir.StandardOp.MoveOp;
@@ -563,22 +566,23 @@
     private static void const2stack(CompilationResultBuilder crb, AMD64MacroAssembler masm, Value result, JavaConstant input) {
         assert !crb.codeCache.needsDataPatch(input);
         AMD64Address dest = (AMD64Address) crb.asAddress(result);
+        final long imm;
         switch (input.getKind().getStackKind()) {
             case Int:
-                masm.movl(dest, input.asInt());
+                imm = input.asInt();
                 break;
             case Long:
-                masm.movlong(dest, input.asLong());
+                imm = input.asLong();
                 break;
             case Float:
-                masm.movl(dest, floatToRawIntBits(input.asFloat()));
+                imm = floatToRawIntBits(input.asFloat());
                 break;
             case Double:
-                masm.movlong(dest, doubleToRawLongBits(input.asDouble()));
+                imm = doubleToRawLongBits(input.asDouble());
                 break;
             case Object:
                 if (input.isNull()) {
-                    masm.movlong(dest, 0L);
+                    imm = 0;
                 } else {
                     throw GraalInternalError.shouldNotReachHere("Non-null object constants must be in register");
                 }
@@ -586,5 +590,27 @@
             default:
                 throw GraalInternalError.shouldNotReachHere();
         }
+        switch (result.getKind()) {
+            case Byte:
+                assert NumUtil.isByte(imm) : "Is not in byte range: " + imm;
+                AMD64MIOp.MOVB.emit(masm, OperandSize.BYTE, dest, (int) imm);
+                break;
+            case Short:
+                assert NumUtil.isShort(imm) : "Is not in short range: " + imm;
+                AMD64MIOp.MOV.emit(masm, OperandSize.WORD, dest, (int) imm);
+                break;
+            case Int:
+            case Float:
+                assert NumUtil.isInt(imm) : "Is not in int range: " + imm;
+                masm.movl(dest, (int) imm);
+                break;
+            case Long:
+            case Double:
+            case Object:
+                masm.movlong(dest, imm);
+                break;
+            default:
+                throw GraalInternalError.shouldNotReachHere("Unknown result Kind: " + result.getKind());
+        }
     }
 }