# HG changeset patch # User Josef Eisl # Date 1432135834 -7200 # Node ID a4f376f516dc74c5a17522eab1691fe1b8a7209f # Parent 3c66c48a28f365d0dc4dfd3765a43ce5fe7a60b1 AMD64Move: refactor #const2stack and add support for short and byte. diff -r 3c66c48a28f3 -r a4f376f516dc graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Move.java --- 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()); + } } }