# HG changeset patch # User Lukas Stadler # Date 1403525583 -7200 # Node ID 13b2e8c4c720ea4dccea65dd7a1ade4b4a889b1b # Parent 866438171d1dea43b7f5596a9c7a2eb27988571d infer stamps for ReverseBytesNode diff -r 866438171d1d -r 13b2e8c4c720 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ReverseBytesNode.java --- 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