Mercurial > hg > graal-jvmci-8
changeset 17102:8c9ab783e814
DirectReadNode from unsafe does now sign/zero extend values which are shorter than int
author | Stefan Anzinger <stefan.anzinger@oracle.com> |
---|---|
date | Fri, 12 Sep 2014 12:51:34 -0700 |
parents | a3fa16378eaa |
children | 69d8f4e45ee2 |
files | graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/DirectReadNode.java |
diffstat | 1 files changed, 26 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- 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")