# HG changeset patch # User Stefan Anzinger # Date 1410551494 25200 # Node ID 8c9ab783e81459d0e016298258be47320ef2b403 # Parent a3fa16378eaad13d84e1beed2faa0c347dbb18e6 DirectReadNode from unsafe does now sign/zero extend values which are shorter than int diff -r a3fa16378eaa -r 8c9ab783e814 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/DirectReadNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/DirectReadNode.java Thu Sep 11 11:26:23 2014 -0700 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/DirectReadNode.java Fri Sep 12 12:51:34 2014 -0700 @@ -28,6 +28,7 @@ import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.nodeinfo.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.spi.*; @@ -46,7 +47,7 @@ } protected DirectReadNode(ValueNode address, Kind readKind) { - super(StampFactory.forKind(readKind)); + super(StampFactory.forKind(readKind.getStackKind())); this.address = address; this.readKind = readKind; } @@ -55,10 +56,33 @@ return address; } + /** + * If we are sub it sizes, we try to sign/zero extend the value to at least int as it is done in + * the {@link com.oracle.graal.replacements.DefaultJavaLoweringProvider#implicitLoadConvert} and + * {@link com.oracle.graal.replacements.DefaultJavaLoweringProvider#createUnsafeRead} + * + * @see com.oracle.graal.replacements.DefaultJavaLoweringProvider#implicitLoadConvert + * @see com.oracle.graal.replacements.DefaultJavaLoweringProvider#createUnsafeRead + */ @Override public void generate(NodeLIRBuilderTool gen) { LIRKind kind = gen.getLIRGeneratorTool().target().getLIRKind(readKind); - gen.setResult(this, gen.getLIRGeneratorTool().emitLoad(kind, gen.operand(address), null)); + Value loaded = gen.getLIRGeneratorTool().emitLoad(kind, gen.operand(address), null); + switch ((Kind) kind.getPlatformKind()) { + case Byte: + loaded = gen.getLIRGeneratorTool().emitSignExtend(loaded, 8, 32); + break; + case Short: + loaded = gen.getLIRGeneratorTool().emitSignExtend(loaded, 16, 32); + break; + case Boolean: + loaded = gen.getLIRGeneratorTool().emitZeroExtend(loaded, 8, 32); + break; + case Char: + loaded = gen.getLIRGeneratorTool().emitZeroExtend(loaded, 16, 32); + break; + } + gen.setResult(this, loaded); } @SuppressWarnings("unchecked")