# HG changeset patch # User Roland Schatz # Date 1431510797 -7200 # Node ID c4b87ad2c4c8b553be64508e15416884c517e039 # Parent 19801a65cf571ded902306e64f74d25b88006a3d Improve code generation for zero extend on AMD64. diff -r 19801a65cf57 -r c4b87ad2c4c8 graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java --- a/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java Tue May 12 18:26:52 2015 -0700 +++ b/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java Wed May 13 11:53:17 2015 +0200 @@ -1066,16 +1066,36 @@ return result; } else { assert inputVal.getKind().getStackKind() == Kind.Int; - Variable result = newVariable(LIRKind.derive(inputVal).changeType(Kind.Int)); - int mask = (int) CodeUtil.mask(fromBits); - append(new AMD64Binary.DataOp(AND.getRMOpcode(DWORD), DWORD, result, asAllocatable(inputVal), JavaConstant.forInt(mask))); + + LIRKind resultKind = LIRKind.derive(inputVal); + OperandSize resultSize; if (toBits > 32) { - Variable longResult = newVariable(LIRKind.derive(inputVal).changeType(Kind.Long)); - emitMove(longResult, result); - return longResult; + resultKind = resultKind.changeType(Kind.Long); + resultSize = QWORD; } else { - return result; + resultKind = resultKind.changeType(Kind.Int); + resultSize = DWORD; + } + + switch (fromBits) { + case 8: + return emitConvertOp(resultKind, MOVZXB, resultSize, inputVal); + case 16: + return emitConvertOp(resultKind, MOVZX, resultSize, inputVal); + case 32: + return emitConvertOp(resultKind, MOV, DWORD, inputVal); } + + // odd bit count, fall back on manual masking + Variable result = newVariable(resultKind); + JavaConstant mask; + if (toBits > 32) { + mask = JavaConstant.forLong(CodeUtil.mask(fromBits)); + } else { + mask = JavaConstant.forInt((int) CodeUtil.mask(fromBits)); + } + append(new AMD64Binary.DataOp(AND.getRMOpcode(DWORD), DWORD, result, asAllocatable(inputVal), mask)); + return result; } }