Mercurial > hg > graal-jvmci-8
changeset 16161:13b2e8c4c720
infer stamps for ReverseBytesNode
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Mon, 23 Jun 2014 14:13:03 +0200 |
parents | 866438171d1d |
children | b3945bb0016f |
files | graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ReverseBytesNode.java |
diffstat | 1 files changed, 15 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ReverseBytesNode.java Mon Jun 23 14:13:01 2014 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ReverseBytesNode.java Mon Jun 23 14:13:03 2014 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,30 +24,31 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.type.*; -import com.oracle.graal.graph.*; -import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; -public class ReverseBytesNode extends UnaryNode implements LIRLowerable, Canonicalizable { +public class ReverseBytesNode extends UnaryNode implements LIRLowerable { public ReverseBytesNode(ValueNode value) { super(StampFactory.forKind(value.getKind()), value); - assert getKind().isNumericInteger(); + assert getKind() == Kind.Int || getKind() == Kind.Long; } @Override - public Node canonical(CanonicalizerTool tool) { - if (getValue().isConstant()) { - long v = getValue().asConstant().asLong(); - if (getKind().getStackKind() == Kind.Int) { - return ConstantNode.forInt(Integer.reverseBytes((int) v), graph()); - } else if (getKind() == Kind.Long) { - return ConstantNode.forLong(Long.reverseBytes(v), graph()); - } + public boolean inferStamp() { + IntegerStamp valueStamp = (IntegerStamp) getValue().stamp(); + Stamp newStamp; + if (getKind() == Kind.Int) { + long mask = IntegerStamp.defaultMask(Kind.Int.getBitCount()); + newStamp = StampTool.stampForMask(valueStamp.getBits(), reverse((int) valueStamp.downMask()) & mask, reverse((int) valueStamp.upMask()) & mask); + } else if (getKind() == Kind.Long) { + newStamp = StampTool.stampForMask(valueStamp.getBits(), reverse(valueStamp.downMask()), reverse(valueStamp.upMask())); + } else { + return false; } - return this; + return updateStamp(newStamp); } @NodeIntrinsic