# HG changeset patch # User Roland Schatz # Date 1411117246 -7200 # Node ID 189479d72dc85a92ddd85f354e2be7e286288c52 # Parent 41a75081678ced8740870938ca84042483f12a08 Move bit manipulation methods to CodeUtil class. diff -r 41a75081678c -r 189479d72dc8 graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/CodeUtil.java --- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/CodeUtil.java Wed Sep 24 11:18:44 2014 +0200 +++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/CodeUtil.java Fri Sep 19 11:00:46 2014 +0200 @@ -47,7 +47,7 @@ /** * Checks whether the specified integer is a power of two. - * + * * @param val the value to check * @return {@code true} if the value is a power of two; {@code false} otherwise */ @@ -57,7 +57,7 @@ /** * Checks whether the specified long is a power of two. - * + * * @param val the value to check * @return {@code true} if the value is a power of two; {@code false} otherwise */ @@ -68,7 +68,7 @@ /** * Computes the log (base 2) of the specified integer, rounding down. (E.g {@code log2(8) = 3}, * {@code log2(21) = 4} ) - * + * * @param val the value * @return the log base 2 of the value */ @@ -80,7 +80,7 @@ /** * Computes the log (base 2) of the specified long, rounding down. (E.g {@code log2(8) = 3}, * {@code log2(21) = 4}) - * + * * @param val the value * @return the log base 2 of the value */ @@ -90,8 +90,100 @@ } /** + * Narrow an integer value to a given bit width, and return the result as a signed long. + * + * @param value the value + * @param resultBits the result bit width + * @return {@code value} interpreted as {@code resultBits} bit number, encoded as signed long + */ + public static long narrow(long value, int resultBits) { + long ret = value & mask(resultBits); + return signExtend(ret, resultBits); + } + + /** + * Sign extend an integer. + * + * @param value the input value + * @param inputBits the bit width of the input value + * @return a signed long with the same value as the signed {@code inputBits}-bit number + * {@code value} + */ + public static long signExtend(long value, int inputBits) { + if (inputBits < 64) { + if ((value >>> (inputBits - 1) & 1) == 1) { + return value | (-1L << inputBits); + } else { + return value & ~(-1L << inputBits); + } + } else { + return value; + } + } + + /** + * Zero extend an integer. + * + * @param value the input value + * @param inputBits the bit width of the input value + * @return an unsigned long with the same value as the unsigned {@code inputBits}-bit number + * {@code value} + */ + public static long zeroExtend(long value, int inputBits) { + if (inputBits < 64) { + return value & ~(-1L << inputBits); + } else { + return value; + } + } + + /** + * Convert an integer to long. + * + * @param value the input value + * @param inputBits the bit width of the input value + * @param unsigned whether the values should be interpreted as signed or unsigned + * @return a long with the same value as the {@code inputBits}-bit number {@code value} + */ + public static long convert(long value, int inputBits, boolean unsigned) { + if (unsigned) { + return zeroExtend(value, inputBits); + } else { + return signExtend(value, inputBits); + } + } + + /** + * Get a bitmask with the low {@code bits} bit set and the high {@code 64 - bits} bit clear. + */ + public static long mask(int bits) { + assert 0 <= bits && bits <= 64; + if (bits == 64) { + return 0xffffffffffffffffL; + } else { + return (1L << bits) - 1; + } + } + + /** + * Get the minimum value representable in a {@code bits} bit signed integer. + */ + public static long minValue(int bits) { + assert 0 < bits && bits <= 64; + return -1L << (bits - 1); + } + + /** + * Get the maximum value representable in a {@code bits} bit signed integer. + */ + public static long maxValue(int bits) { + assert 0 < bits && bits <= 64; + return mask(bits - 1); + } + + /** * Formats the values in a frame as a tabulated string. - * + * * @param frame * @return the values in {@code frame} as a tabulated string */ @@ -131,7 +223,7 @@ /** * Formats a given table as a string. The value of each cell is produced by * {@link String#valueOf(Object)}. - * + * * @param cells the cells of the table in row-major order * @param cols the number of columns per row * @param lpad the number of space padding inserted before each formatted cell value @@ -179,7 +271,7 @@ /** * Appends a formatted code position to a {@link StringBuilder}. - * + * * @param sb the {@link StringBuilder} to append to * @param pos the code position to format and append to {@code sb} * @return the value of {@code sb} @@ -195,7 +287,7 @@ /** * Appends a formatted frame to a {@link StringBuilder}. - * + * * @param sb the {@link StringBuilder} to append to * @param frame the frame to format and append to {@code sb} * @return the value of {@code sb} @@ -293,7 +385,7 @@ /** * Appends a formatted debug info to a {@link StringBuilder}. - * + * * @param sb the {@link StringBuilder} to append to * @param info the debug info to format and append to {@code sb} * @return the value of {@code sb} diff -r 41a75081678c -r 189479d72dc8 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 Wed Sep 24 11:18:44 2014 +0200 +++ b/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java Fri Sep 19 11:00:46 2014 +0200 @@ -37,7 +37,6 @@ import com.oracle.graal.asm.amd64.AMD64Assembler.ConditionFlag; import com.oracle.graal.compiler.common.*; import com.oracle.graal.compiler.common.calc.*; -import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.lir.*; import com.oracle.graal.lir.StandardOp.JumpOp; import com.oracle.graal.lir.amd64.*; @@ -49,6 +48,7 @@ import com.oracle.graal.lir.amd64.AMD64Arithmetic.BinaryRegStackConst; import com.oracle.graal.lir.amd64.AMD64Arithmetic.DivRemOp; import com.oracle.graal.lir.amd64.AMD64Arithmetic.FPDivRemOp; +import com.oracle.graal.lir.amd64.AMD64Arithmetic.MulHighOp; import com.oracle.graal.lir.amd64.AMD64Arithmetic.Unary1Op; import com.oracle.graal.lir.amd64.AMD64Arithmetic.Unary2MemoryOp; import com.oracle.graal.lir.amd64.AMD64Arithmetic.Unary2Op; @@ -958,13 +958,13 @@ } else if (fromBits > 32) { assert inputVal.getKind() == Kind.Long; Variable result = newVariable(LIRKind.derive(inputVal).changeType(Kind.Long)); - long mask = IntegerStamp.defaultMask(fromBits); + long mask = CodeUtil.mask(fromBits); append(new BinaryRegConst(AMD64Arithmetic.LAND, result, asAllocatable(inputVal), Constant.forLong(mask))); return result; } else { assert inputVal.getKind().getStackKind() == Kind.Int; Variable result = newVariable(LIRKind.derive(inputVal).changeType(Kind.Int)); - int mask = (int) IntegerStamp.defaultMask(fromBits); + int mask = (int) CodeUtil.mask(fromBits); append(new BinaryRegConst(AMD64Arithmetic.IAND, result, asAllocatable(inputVal), Constant.forInt(mask))); if (toBits > 32) { Variable longResult = newVariable(LIRKind.derive(inputVal).changeType(Kind.Long)); diff -r 41a75081678c -r 189479d72dc8 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IntegerStamp.java --- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IntegerStamp.java Wed Sep 24 11:18:44 2014 +0200 +++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IntegerStamp.java Fri Sep 19 11:00:46 2014 +0200 @@ -24,6 +24,7 @@ import java.util.*; +import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.*; import com.oracle.graal.compiler.common.spi.*; @@ -47,20 +48,20 @@ this.upperBound = upperBound; this.downMask = downMask; this.upMask = upMask; - assert lowerBound >= defaultMinValue(bits) : this; - assert upperBound <= defaultMaxValue(bits) : this; - assert (downMask & defaultMask(bits)) == downMask : this; - assert (upMask & defaultMask(bits)) == upMask : this; + assert lowerBound >= CodeUtil.minValue(bits) : this; + assert upperBound <= CodeUtil.maxValue(bits) : this; + assert (downMask & CodeUtil.mask(bits)) == downMask : this; + assert (upMask & CodeUtil.mask(bits)) == upMask : this; } @Override public Stamp unrestricted() { - return new IntegerStamp(getBits(), defaultMinValue(getBits()), defaultMaxValue(getBits()), 0, defaultMask(getBits())); + return new IntegerStamp(getBits(), CodeUtil.minValue(getBits()), CodeUtil.maxValue(getBits()), 0, CodeUtil.mask(getBits())); } @Override public Stamp illegal() { - return new IntegerStamp(getBits(), defaultMaxValue(getBits()), defaultMinValue(getBits()), defaultMask(getBits()), 0); + return new IntegerStamp(getBits(), CodeUtil.maxValue(getBits()), CodeUtil.minValue(getBits()), CodeUtil.mask(getBits()), 0); } @Override @@ -135,11 +136,11 @@ } public boolean isUnrestricted() { - return lowerBound == defaultMinValue(getBits()) && upperBound == defaultMaxValue(getBits()) && downMask == 0 && upMask == defaultMask(getBits()); + return lowerBound == CodeUtil.minValue(getBits()) && upperBound == CodeUtil.maxValue(getBits()) && downMask == 0 && upMask == CodeUtil.mask(getBits()); } public boolean contains(long value) { - return value >= lowerBound && value <= upperBound && (value & downMask) == downMask && (value & upMask) == (value & defaultMask(getBits())); + return value >= lowerBound && value <= upperBound && (value & downMask) == downMask && (value & upMask) == (value & CodeUtil.mask(getBits())); } public boolean isPositive() { @@ -173,14 +174,14 @@ str.append(getBits()); if (lowerBound == upperBound) { str.append(" [").append(lowerBound).append(']'); - } else if (lowerBound != defaultMinValue(getBits()) || upperBound != defaultMaxValue(getBits())) { + } else if (lowerBound != CodeUtil.minValue(getBits()) || upperBound != CodeUtil.maxValue(getBits())) { str.append(" [").append(lowerBound).append(" - ").append(upperBound).append(']'); } if (downMask != 0) { str.append(" \u21ca"); new Formatter(str).format("%016x", downMask); } - if (upMask != defaultMask(getBits())) { + if (upMask != CodeUtil.mask(getBits())) { str.append(" \u21c8"); new Formatter(str).format("%016x", upMask); } @@ -268,29 +269,12 @@ return true; } - public static long defaultMask(int bits) { - assert 0 <= bits && bits <= 64; - if (bits == 64) { - return 0xffffffffffffffffL; - } else { - return (1L << bits) - 1; - } - } - - public static long defaultMinValue(int bits) { - return -1L << (bits - 1); - } - - public static long defaultMaxValue(int bits) { - return defaultMask(bits - 1); - } - public static long upMaskFor(int bits, long lowerBound, long upperBound) { long mask = lowerBound | upperBound; if (mask == 0) { return 0; } else { - return ((-1L) >>> Long.numberOfLeadingZeros(mask)) & defaultMask(bits); + return ((-1L) >>> Long.numberOfLeadingZeros(mask)) & CodeUtil.mask(bits); } } diff -r 41a75081678c -r 189479d72dc8 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/StampFactory.java --- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/StampFactory.java Wed Sep 24 11:18:44 2014 +0200 +++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/StampFactory.java Fri Sep 19 11:00:46 2014 +0200 @@ -22,6 +22,7 @@ */ package com.oracle.graal.compiler.common.type; +import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.*; @@ -45,9 +46,9 @@ int bits = kind.getStackKind().getBitCount(); long mask; if (kind.isUnsigned()) { - mask = IntegerStamp.defaultMask(kind.getBitCount()); + mask = CodeUtil.mask(kind.getBitCount()); } else { - mask = IntegerStamp.defaultMask(bits); + mask = CodeUtil.mask(bits); } setCache(kind, new IntegerStamp(bits, kind.getMinValue(), kind.getMaxValue(), 0, mask)); } @@ -128,11 +129,11 @@ } public static IntegerStamp forInteger(int bits) { - return new IntegerStamp(bits, IntegerStamp.defaultMinValue(bits), IntegerStamp.defaultMaxValue(bits), 0, IntegerStamp.defaultMask(bits)); + return new IntegerStamp(bits, CodeUtil.minValue(bits), CodeUtil.maxValue(bits), 0, CodeUtil.mask(bits)); } public static IntegerStamp forInteger(int bits, long lowerBound, long upperBound) { - long defaultMask = IntegerStamp.defaultMask(bits); + long defaultMask = CodeUtil.mask(bits); if (lowerBound == upperBound) { return new IntegerStamp(bits, lowerBound, lowerBound, lowerBound & defaultMask, lowerBound & defaultMask); } @@ -175,7 +176,7 @@ case Short: case Int: case Long: - long mask = value.asLong() & IntegerStamp.defaultMask(kind.getBitCount()); + long mask = value.asLong() & CodeUtil.mask(kind.getBitCount()); return forInteger(kind.getStackKind(), value.asLong(), value.asLong(), mask, mask); case Float: return forFloat(kind, value.asFloat(), value.asFloat(), !Float.isNaN(value.asFloat())); diff -r 41a75081678c -r 189479d72dc8 graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java --- a/graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java Wed Sep 24 11:18:44 2014 +0200 +++ b/graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java Fri Sep 19 11:00:46 2014 +0200 @@ -33,7 +33,6 @@ import com.oracle.graal.asm.*; import com.oracle.graal.compiler.common.*; import com.oracle.graal.compiler.common.calc.*; -import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.lir.*; import com.oracle.graal.lir.StandardOp.JumpOp; import com.oracle.graal.lir.gen.*; @@ -709,13 +708,13 @@ } else if (fromBits > 32) { assert inputVal.getKind() == Kind.Long; Variable result = newVariable(LIRKind.derive(inputVal).changeType(Kind.Long)); - long mask = IntegerStamp.defaultMask(fromBits); + long mask = CodeUtil.mask(fromBits); append(new Op2Stack(LAND, result, inputVal, Constant.forLong(mask))); return result; } else { assert inputVal.getKind() == Kind.Int; Variable result = newVariable(LIRKind.derive(inputVal).changeType(Kind.Int)); - int mask = (int) IntegerStamp.defaultMask(fromBits); + int mask = (int) CodeUtil.mask(fromBits); append(new Op2Stack(IAND, result, inputVal, Constant.forInt(mask))); if (toBits > 32) { Variable longResult = newVariable(LIRKind.derive(inputVal).changeType(Kind.Long)); diff -r 41a75081678c -r 189479d72dc8 graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java --- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Wed Sep 24 11:18:44 2014 +0200 +++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Fri Sep 19 11:00:46 2014 +0200 @@ -36,7 +36,6 @@ import com.oracle.graal.asm.sparc.SPARCAssembler.ConditionFlag; import com.oracle.graal.compiler.common.*; import com.oracle.graal.compiler.common.calc.*; -import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.lir.*; import com.oracle.graal.lir.gen.*; import com.oracle.graal.lir.sparc.*; @@ -997,13 +996,13 @@ } else if (fromBits > 32) { assert inputVal.getKind() == Kind.Long; Variable result = newVariable(LIRKind.derive(inputVal).changeType(Kind.Long)); - long mask = IntegerStamp.defaultMask(fromBits); + long mask = CodeUtil.mask(fromBits); append(new BinaryRegConst(SPARCArithmetic.LAND, result, asAllocatable(inputVal), Constant.forLong(mask), null)); return result; } else { assert inputVal.getKind() == Kind.Int || inputVal.getKind() == Kind.Short || inputVal.getKind() == Kind.Byte || inputVal.getKind() == Kind.Char : inputVal.getKind(); Variable result = newVariable(LIRKind.derive(inputVal).changeType(Kind.Int)); - long mask = IntegerStamp.defaultMask(fromBits); + long mask = CodeUtil.mask(fromBits); Constant constant = Constant.forInt((int) mask); if (fromBits == 32) { append(new BinaryRegConst(IUSHR, result, inputVal, Constant.forInt(0))); diff -r 41a75081678c -r 189479d72dc8 graal/com.oracle.graal.loop/src/com/oracle/graal/loop/CountedLoopInfo.java --- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/CountedLoopInfo.java Wed Sep 24 11:18:44 2014 +0200 +++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/CountedLoopInfo.java Fri Sep 19 11:00:46 2014 +0200 @@ -24,6 +24,7 @@ import static com.oracle.graal.nodes.calc.IntegerArithmeticNode.*; +import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.loop.InductionVariable.Direction; @@ -143,14 +144,14 @@ CompareNode cond; // we use a negated guard with a < condition to achieve a >= ConstantNode one = ConstantNode.forIntegerStamp(stamp, 1, graph); if (iv.direction() == Direction.Up) { - IntegerArithmeticNode v1 = sub(graph, ConstantNode.forIntegerStamp(stamp, IntegerStamp.defaultMaxValue(stamp.getBits()), graph), sub(graph, iv.strideNode(), one)); + IntegerArithmeticNode v1 = sub(graph, ConstantNode.forIntegerStamp(stamp, CodeUtil.maxValue(stamp.getBits()), graph), sub(graph, iv.strideNode(), one)); if (oneOff) { v1 = sub(graph, v1, one); } cond = graph.unique(IntegerLessThanNode.create(v1, end)); } else { assert iv.direction() == Direction.Down; - IntegerArithmeticNode v1 = add(graph, ConstantNode.forIntegerStamp(stamp, IntegerStamp.defaultMinValue(stamp.getBits()), graph), sub(graph, one, iv.strideNode())); + IntegerArithmeticNode v1 = add(graph, ConstantNode.forIntegerStamp(stamp, CodeUtil.minValue(stamp.getBits()), graph), sub(graph, one, iv.strideNode())); if (oneOff) { v1 = add(graph, v1, one); } diff -r 41a75081678c -r 189479d72dc8 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java Wed Sep 24 11:18:44 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java Fri Sep 19 11:00:46 2014 +0200 @@ -24,6 +24,7 @@ import java.util.*; +import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.*; import com.oracle.graal.compiler.common.type.*; @@ -318,7 +319,7 @@ private static ConstantNode forIntegerBits(int bits, Constant constant, StructuredGraph graph) { long value = constant.asLong(); - long bounds = SignExtendNode.signExtend(value, bits); + long bounds = CodeUtil.signExtend(value, bits); return unique(graph, ConstantNode.create(constant, StampFactory.forInteger(bits, bounds, bounds))); } @@ -332,7 +333,7 @@ private static ConstantNode forIntegerBits(int bits, Constant constant) { long value = constant.asLong(); - long bounds = SignExtendNode.signExtend(value, bits); + long bounds = CodeUtil.signExtend(value, bits); return ConstantNode.create(constant, StampFactory.forInteger(bits, bounds, bounds)); } diff -r 41a75081678c -r 189479d72dc8 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AndNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AndNode.java Wed Sep 24 11:18:44 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AndNode.java Fri Sep 19 11:00:46 2014 +0200 @@ -22,6 +22,7 @@ */ package com.oracle.graal.nodes.calc; +import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.graph.spi.*; @@ -67,7 +68,7 @@ return ConstantNode.forPrimitive(stamp(), evalConst(forX.asConstant(), forY.asConstant())); } else if (forY.isConstant()) { long rawY = forY.asConstant().asLong(); - long mask = IntegerStamp.defaultMask(PrimitiveStamp.getBits(stamp())); + long mask = CodeUtil.mask(PrimitiveStamp.getBits(stamp())); if ((rawY & mask) == mask) { return forX; } diff -r 41a75081678c -r 189479d72dc8 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java Wed Sep 24 11:18:44 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java Fri Sep 19 11:00:46 2014 +0200 @@ -52,14 +52,6 @@ } } - public static long convert(long value, int bits, boolean unsigned) { - if (unsigned) { - return ZeroExtendNode.zeroExtend(value, bits); - } else { - return SignExtendNode.signExtend(value, bits); - } - } - protected ValueNode canonicalConvert(@SuppressWarnings("hiding") ValueNode value) { if (value.stamp() instanceof IntegerStamp) { int inputBits = ((IntegerStamp) value.stamp()).getBits(); diff -r 41a75081678c -r 189479d72dc8 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NarrowNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NarrowNode.java Wed Sep 24 11:18:44 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NarrowNode.java Fri Sep 19 11:00:46 2014 +0200 @@ -22,8 +22,8 @@ */ package com.oracle.graal.nodes.calc; +import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; -import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.graph.spi.*; import com.oracle.graal.lir.gen.*; import com.oracle.graal.nodeinfo.*; @@ -45,19 +45,14 @@ super(StampTool.narrowingConversion(input.stamp(), resultBits), input, resultBits); } - public static long narrow(long value, int resultBits) { - long ret = value & IntegerStamp.defaultMask(resultBits); - return SignExtendNode.signExtend(ret, resultBits); - } - @Override public Constant convert(Constant c) { - return Constant.forPrimitiveInt(getResultBits(), narrow(c.asLong(), getResultBits())); + return Constant.forPrimitiveInt(getResultBits(), CodeUtil.narrow(c.asLong(), getResultBits())); } @Override public Constant reverse(Constant input) { - long result = SignExtendNode.signExtend(input.asLong(), getResultBits()); + long result = CodeUtil.signExtend(input.asLong(), getResultBits()); return Constant.forPrimitiveInt(getInputBits(), result); } diff -r 41a75081678c -r 189479d72dc8 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/OrNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/OrNode.java Wed Sep 24 11:18:44 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/OrNode.java Fri Sep 19 11:00:46 2014 +0200 @@ -22,6 +22,7 @@ */ package com.oracle.graal.nodes.calc; +import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.graph.spi.*; @@ -67,7 +68,7 @@ return ConstantNode.forPrimitive(stamp(), evalConst(forX.asConstant(), forY.asConstant())); } else if (forY.isConstant()) { long rawY = forY.asConstant().asLong(); - long mask = IntegerStamp.defaultMask(PrimitiveStamp.getBits(stamp())); + long mask = CodeUtil.mask(PrimitiveStamp.getBits(stamp())); if ((rawY & mask) == mask) { return ConstantNode.forIntegerStamp(stamp(), mask); } diff -r 41a75081678c -r 189479d72dc8 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/SignExtendNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/SignExtendNode.java Wed Sep 24 11:18:44 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/SignExtendNode.java Fri Sep 19 11:00:46 2014 +0200 @@ -22,6 +22,7 @@ */ package com.oracle.graal.nodes.calc; +import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.graph.spi.*; @@ -45,26 +46,14 @@ super(StampTool.signExtend(input.stamp(), resultBits), input, resultBits); } - public static long signExtend(long value, int inputBits) { - if (inputBits < 64) { - if ((value >>> (inputBits - 1) & 1) == 1) { - return value | (-1L << inputBits); - } else { - return value & ~(-1L << inputBits); - } - } else { - return value; - } - } - @Override public Constant convert(Constant c) { - return Constant.forPrimitiveInt(getResultBits(), signExtend(c.asLong(), getInputBits())); + return Constant.forPrimitiveInt(getResultBits(), CodeUtil.signExtend(c.asLong(), getInputBits())); } @Override public Constant reverse(Constant c) { - return Constant.forPrimitiveInt(getInputBits(), NarrowNode.narrow(c.asLong(), getInputBits())); + return Constant.forPrimitiveInt(getInputBits(), CodeUtil.narrow(c.asLong(), getInputBits())); } @Override diff -r 41a75081678c -r 189479d72dc8 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/XorNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/XorNode.java Wed Sep 24 11:18:44 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/XorNode.java Fri Sep 19 11:00:46 2014 +0200 @@ -22,6 +22,7 @@ */ package com.oracle.graal.nodes.calc; +import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.graph.spi.*; @@ -67,7 +68,7 @@ return ConstantNode.forPrimitive(stamp(), evalConst(forX.asConstant(), forY.asConstant())); } else if (forY.isConstant()) { long rawY = forY.asConstant().asLong(); - long mask = IntegerStamp.defaultMask(PrimitiveStamp.getBits(stamp())); + long mask = CodeUtil.mask(PrimitiveStamp.getBits(stamp())); if ((rawY & mask) == 0) { return forX; } else if ((rawY & mask) == mask) { diff -r 41a75081678c -r 189479d72dc8 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ZeroExtendNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ZeroExtendNode.java Wed Sep 24 11:18:44 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ZeroExtendNode.java Fri Sep 19 11:00:46 2014 +0200 @@ -22,6 +22,7 @@ */ package com.oracle.graal.nodes.calc; +import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.calc.*; import com.oracle.graal.compiler.common.type.*; @@ -46,22 +47,14 @@ super(StampTool.zeroExtend(input.stamp(), resultBits), input, resultBits); } - public static long zeroExtend(long value, int inputBits) { - if (inputBits < 64) { - return value & ~(-1L << inputBits); - } else { - return value; - } - } - @Override public Constant convert(Constant c) { - return Constant.forPrimitiveInt(getResultBits(), zeroExtend(c.asLong(), getInputBits())); + return Constant.forPrimitiveInt(getResultBits(), CodeUtil.zeroExtend(c.asLong(), getInputBits())); } @Override public Constant reverse(Constant c) { - return Constant.forPrimitiveInt(getInputBits(), NarrowNode.narrow(c.asLong(), getInputBits())); + return Constant.forPrimitiveInt(getInputBits(), CodeUtil.narrow(c.asLong(), getInputBits())); } @Override @@ -100,7 +93,7 @@ Stamp inputStamp = narrow.getValue().stamp(); if (inputStamp instanceof IntegerStamp && inputStamp.isCompatible(stamp())) { IntegerStamp istamp = (IntegerStamp) inputStamp; - long mask = IntegerStamp.defaultMask(PrimitiveStamp.getBits(narrow.stamp())); + long mask = CodeUtil.mask(PrimitiveStamp.getBits(narrow.stamp())); if (((istamp.upMask() | istamp.downMask()) & ~mask) == 0) { // The original value is in the range of the masked zero extended result so // simply return the original input. diff -r 41a75081678c -r 189479d72dc8 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java Wed Sep 24 11:18:44 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java Fri Sep 19 11:00:46 2014 +0200 @@ -24,10 +24,10 @@ import java.util.*; +import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.nodes.*; -import com.oracle.graal.nodes.calc.*; /** * Helper class that is used to keep all stamp-related operations in one place. @@ -38,7 +38,7 @@ if (stamp instanceof IntegerStamp) { IntegerStamp integerStamp = (IntegerStamp) stamp; int bits = integerStamp.getBits(); - if (integerStamp.lowerBound() != IntegerStamp.defaultMinValue(bits)) { + if (integerStamp.lowerBound() != CodeUtil.minValue(bits)) { // TODO(ls) check if the mask calculation is correct... return StampFactory.forInteger(bits, -integerStamp.upperBound(), -integerStamp.lowerBound()); } @@ -54,7 +54,7 @@ if (stamp instanceof IntegerStamp) { IntegerStamp integerStamp = (IntegerStamp) stamp; int bits = integerStamp.getBits(); - long defaultMask = IntegerStamp.defaultMask(bits); + long defaultMask = CodeUtil.mask(bits); return new IntegerStamp(bits, ~integerStamp.upperBound(), ~integerStamp.lowerBound(), (~integerStamp.upMask()) & defaultMask, (~integerStamp.downMask()) & defaultMask); } return stamp.unrestricted(); @@ -119,9 +119,9 @@ long upperBound = Math.max(stamp1.upperBound(), 0); long magnitude; // the maximum absolute value of the result, derived from stamp2 - if (stamp2.lowerBound() == IntegerStamp.defaultMinValue(stamp2.getBits())) { + if (stamp2.lowerBound() == CodeUtil.minValue(stamp2.getBits())) { // Math.abs(...) - 1 does not work in this case - magnitude = IntegerStamp.defaultMaxValue(stamp2.getBits()); + magnitude = CodeUtil.maxValue(stamp2.getBits()); } else { magnitude = Math.max(Math.abs(stamp2.lowerBound()), Math.abs(stamp2.upperBound())) - 1; } @@ -136,7 +136,7 @@ if (bits == 64) { return (~x & ~y & result) < 0; } else { - return result > IntegerStamp.defaultMaxValue(bits); + return result > CodeUtil.maxValue(bits); } } @@ -145,7 +145,7 @@ if (bits == 64) { return (x & y & ~result) < 0; } else { - return result < IntegerStamp.defaultMinValue(bits); + return result < CodeUtil.minValue(bits); } } @@ -158,7 +158,7 @@ } else if (stamp2.isUnrestricted()) { return stamp2; } - long defaultMask = IntegerStamp.defaultMask(bits); + long defaultMask = CodeUtil.mask(bits); long variableBits = (stamp1.downMask() ^ stamp1.upMask()) | (stamp2.downMask() ^ stamp2.upMask()); long variableBitsWithCarry = variableBits | (carryBits(stamp1.downMask(), stamp2.downMask()) ^ carryBits(stamp1.upMask(), stamp2.upMask())); long newDownMask = (stamp1.downMask() + stamp2.downMask()) & ~variableBitsWithCarry; @@ -174,15 +174,15 @@ boolean lowerOverflowsNegatively = addOverflowsNegatively(stamp1.lowerBound(), stamp2.lowerBound(), bits); boolean upperOverflowsNegatively = addOverflowsNegatively(stamp1.upperBound(), stamp2.upperBound(), bits); if ((lowerOverflowsNegatively && !upperOverflowsNegatively) || (!lowerOverflowsPositively && upperOverflowsPositively)) { - lowerBound = IntegerStamp.defaultMinValue(bits); - upperBound = IntegerStamp.defaultMaxValue(bits); + lowerBound = CodeUtil.minValue(bits); + upperBound = CodeUtil.maxValue(bits); } else { - lowerBound = SignExtendNode.signExtend((stamp1.lowerBound() + stamp2.lowerBound()) & defaultMask, bits); - upperBound = SignExtendNode.signExtend((stamp1.upperBound() + stamp2.upperBound()) & defaultMask, bits); + lowerBound = CodeUtil.signExtend((stamp1.lowerBound() + stamp2.lowerBound()) & defaultMask, bits); + upperBound = CodeUtil.signExtend((stamp1.upperBound() + stamp2.upperBound()) & defaultMask, bits); } IntegerStamp limit = StampFactory.forInteger(bits, lowerBound, upperBound); newUpMask &= limit.upMask(); - upperBound = SignExtendNode.signExtend(upperBound & newUpMask, bits); + upperBound = CodeUtil.signExtend(upperBound & newUpMask, bits); newDownMask |= limit.downMask(); lowerBound |= newDownMask; return new IntegerStamp(bits, lowerBound, upperBound, newDownMask, newUpMask); @@ -206,10 +206,10 @@ upperBound = upMask; } else { lowerBound = downMask | (-1L << (bits - 1)); - upperBound = IntegerStamp.defaultMaxValue(bits) & upMask; + upperBound = CodeUtil.maxValue(bits) & upMask; } - lowerBound = IntegerConvertNode.convert(lowerBound, bits, false); - upperBound = IntegerConvertNode.convert(upperBound, bits, false); + lowerBound = CodeUtil.convert(lowerBound, bits, false); + upperBound = CodeUtil.convert(upperBound, bits, false); return new IntegerStamp(bits, lowerBound, upperBound, downMask, upMask); } @@ -265,7 +265,7 @@ int extraBits = 64 - bits; long shiftMask = bits > 32 ? 0x3FL : 0x1FL; long shiftCount = shift.lowerBound() & shiftMask; - long defaultMask = IntegerStamp.defaultMask(bits); + long defaultMask = CodeUtil.mask(bits); // shifting back and forth performs sign extension long downMask = (value.downMask() << extraBits) >> (shiftCount + extraBits) & defaultMask; long upMask = (value.upMask() << extraBits) >> (shiftCount + extraBits) & defaultMask; @@ -308,7 +308,7 @@ public static Stamp leftShift(IntegerStamp value, IntegerStamp shift) { int bits = value.getBits(); - long defaultMask = IntegerStamp.defaultMask(bits); + long defaultMask = CodeUtil.mask(bits); if (value.upMask() == 0) { return value; } @@ -347,9 +347,9 @@ int inputBits = inputStamp.getBits(); assert inputBits <= resultBits; - long defaultMask = IntegerStamp.defaultMask(resultBits); - long downMask = SignExtendNode.signExtend(inputStamp.downMask(), inputBits) & defaultMask; - long upMask = SignExtendNode.signExtend(inputStamp.upMask(), inputBits) & defaultMask; + long defaultMask = CodeUtil.mask(resultBits); + long downMask = CodeUtil.signExtend(inputStamp.downMask(), inputBits) & defaultMask; + long upMask = CodeUtil.signExtend(inputStamp.upMask(), inputBits) & defaultMask; return new IntegerStamp(resultBits, inputStamp.lowerBound(), inputStamp.upperBound(), downMask, upMask); } else { @@ -363,8 +363,8 @@ int inputBits = inputStamp.getBits(); assert inputBits <= resultBits; - long downMask = ZeroExtendNode.zeroExtend(inputStamp.downMask(), inputBits); - long upMask = ZeroExtendNode.zeroExtend(inputStamp.upMask(), inputBits); + long downMask = CodeUtil.zeroExtend(inputStamp.downMask(), inputBits); + long upMask = CodeUtil.zeroExtend(inputStamp.upMask(), inputBits); if (inputStamp.lowerBound() < 0 && inputStamp.upperBound() >= 0) { // signed range including 0 and -1 @@ -372,8 +372,8 @@ return stampForMask(resultBits, downMask, upMask); } - long lowerBound = ZeroExtendNode.zeroExtend(inputStamp.lowerBound(), inputBits); - long upperBound = ZeroExtendNode.zeroExtend(inputStamp.upperBound(), inputBits); + long lowerBound = CodeUtil.zeroExtend(inputStamp.lowerBound(), inputBits); + long upperBound = CodeUtil.zeroExtend(inputStamp.upperBound(), inputBits); return new IntegerStamp(resultBits, lowerBound, upperBound, downMask, upMask); } else { @@ -391,23 +391,23 @@ } final long upperBound; - if (inputStamp.lowerBound() < IntegerStamp.defaultMinValue(resultBits)) { - upperBound = IntegerStamp.defaultMaxValue(resultBits); + if (inputStamp.lowerBound() < CodeUtil.minValue(resultBits)) { + upperBound = CodeUtil.maxValue(resultBits); } else { upperBound = saturate(inputStamp.upperBound(), resultBits); } final long lowerBound; - if (inputStamp.upperBound() > IntegerStamp.defaultMaxValue(resultBits)) { - lowerBound = IntegerStamp.defaultMinValue(resultBits); + if (inputStamp.upperBound() > CodeUtil.maxValue(resultBits)) { + lowerBound = CodeUtil.minValue(resultBits); } else { lowerBound = saturate(inputStamp.lowerBound(), resultBits); } - long defaultMask = IntegerStamp.defaultMask(resultBits); + long defaultMask = CodeUtil.mask(resultBits); long newDownMask = inputStamp.downMask() & defaultMask; long newUpMask = inputStamp.upMask() & defaultMask; - long newLowerBound = SignExtendNode.signExtend((lowerBound | newDownMask) & newUpMask, resultBits); - long newUpperBound = SignExtendNode.signExtend((upperBound | newDownMask) & newUpMask, resultBits); + long newLowerBound = CodeUtil.signExtend((lowerBound | newDownMask) & newUpMask, resultBits); + long newUpperBound = CodeUtil.signExtend((upperBound | newDownMask) & newUpMask, resultBits); return new IntegerStamp(resultBits, newLowerBound, newUpperBound, newDownMask, newUpMask); } else { return input.illegal(); @@ -429,8 +429,8 @@ lowerBound = saturate(fromStamp.lowerBound(), toKind); } - long defaultMask = IntegerStamp.defaultMask(toKind.getBitCount()); - long intMask = IntegerStamp.defaultMask(32); + long defaultMask = CodeUtil.mask(toKind.getBitCount()); + long intMask = CodeUtil.mask(32); long newUpMask = signExtend(fromStamp.upMask() & defaultMask, toKind) & intMask; long newDownMask = signExtend(fromStamp.downMask() & defaultMask, toKind) & intMask; return new IntegerStamp(toKind.getStackKind().getBitCount(), (int) ((lowerBound | newDownMask) & newUpMask), (int) ((upperBound | newDownMask) & newUpMask), newDownMask, newUpMask); @@ -446,11 +446,11 @@ private static long saturate(long v, int bits) { if (bits < 64) { - long max = IntegerStamp.defaultMaxValue(bits); + long max = CodeUtil.maxValue(bits); if (v > max) { return max; } - long min = IntegerStamp.defaultMinValue(bits); + long min = CodeUtil.minValue(bits); if (v < min) { return min; } diff -r 41a75081678c -r 189479d72dc8 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitCountNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitCountNode.java Wed Sep 24 11:18:44 2014 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitCountNode.java Fri Sep 19 11:00:46 2014 +0200 @@ -22,6 +22,7 @@ */ package com.oracle.graal.replacements.nodes; +import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.graph.spi.*; @@ -45,8 +46,8 @@ @Override public boolean inferStamp() { IntegerStamp valueStamp = (IntegerStamp) getValue().stamp(); - assert (valueStamp.downMask() & IntegerStamp.defaultMask(valueStamp.getBits())) == valueStamp.downMask(); - assert (valueStamp.upMask() & IntegerStamp.defaultMask(valueStamp.getBits())) == valueStamp.upMask(); + assert (valueStamp.downMask() & CodeUtil.mask(valueStamp.getBits())) == valueStamp.downMask(); + assert (valueStamp.upMask() & CodeUtil.mask(valueStamp.getBits())) == valueStamp.upMask(); return updateStamp(StampFactory.forInteger(Kind.Int, bitCount(valueStamp.downMask()), bitCount(valueStamp.upMask()))); } diff -r 41a75081678c -r 189479d72dc8 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanForwardNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanForwardNode.java Wed Sep 24 11:18:44 2014 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanForwardNode.java Fri Sep 19 11:00:46 2014 +0200 @@ -22,6 +22,7 @@ */ package com.oracle.graal.replacements.nodes; +import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.graph.spi.*; @@ -51,7 +52,7 @@ IntegerStamp valueStamp = (IntegerStamp) getValue().stamp(); int min; int max; - long mask = IntegerStamp.defaultMask(valueStamp.getBits()); + long mask = CodeUtil.mask(valueStamp.getBits()); int firstAlwaysSetBit = scan(valueStamp.downMask() & mask); if (firstAlwaysSetBit == -1) { int lastMaybeSetBit = BitScanReverseNode.scan(valueStamp.upMask() & mask); diff -r 41a75081678c -r 189479d72dc8 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanReverseNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanReverseNode.java Wed Sep 24 11:18:44 2014 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanReverseNode.java Fri Sep 19 11:00:46 2014 +0200 @@ -22,6 +22,7 @@ */ package com.oracle.graal.replacements.nodes; +import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.graph.spi.*; @@ -51,7 +52,7 @@ IntegerStamp valueStamp = (IntegerStamp) getValue().stamp(); int min; int max; - long mask = IntegerStamp.defaultMask(valueStamp.getBits()); + long mask = CodeUtil.mask(valueStamp.getBits()); int lastAlwaysSetBit = scan(valueStamp.downMask() & mask); if (lastAlwaysSetBit == -1) { min = -1; diff -r 41a75081678c -r 189479d72dc8 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 Wed Sep 24 11:18:44 2014 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ReverseBytesNode.java Fri Sep 19 11:00:46 2014 +0200 @@ -22,6 +22,7 @@ */ package com.oracle.graal.replacements.nodes; +import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.graph.spi.*; @@ -48,7 +49,7 @@ IntegerStamp valueStamp = (IntegerStamp) getValue().stamp(); Stamp newStamp; if (getKind() == Kind.Int) { - long mask = IntegerStamp.defaultMask(Kind.Int.getBitCount()); + long mask = CodeUtil.mask(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()));