# HG changeset patch # User Roland Schatz # Date 1392984298 -3600 # Node ID 0c38906450a08fa48f2420b208f6ae8fe032cc2b # Parent d4a17336d12185a25c2ddacaa8442ae2da7872df Make conversion from Stamp to PlatformKind extensible by backend. diff -r d4a17336d121 -r 0c38906450a0 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 Fri Feb 21 12:59:52 2014 +0100 +++ b/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java Fri Feb 21 13:04:58 2014 +0100 @@ -127,7 +127,13 @@ @Override public Variable emitMove(Value input) { - Variable result = newVariable(input.getPlatformKind()); + PlatformKind kind; + if (input instanceof Constant) { + kind = input.getKind().getStackKind(); + } else { + kind = input.getPlatformKind(); + } + Variable result = newVariable(kind); emitMove(result, input); return result; } @@ -708,19 +714,20 @@ } } - private AllocatableValue emitConvert1Op(Kind kind, AMD64Arithmetic op, AllocatableValue input) { + private AllocatableValue emitConvert1Op(PlatformKind kind, AMD64Arithmetic op, AllocatableValue input) { Variable result = newVariable(kind); append(new Unary1Op(op, result, input)); return result; } - private AllocatableValue emitConvert2Op(Kind kind, AMD64Arithmetic op, AllocatableValue input) { + private AllocatableValue emitConvert2Op(PlatformKind kind, AMD64Arithmetic op, AllocatableValue input) { Variable result = newVariable(kind); append(new Unary2Op(op, result, input)); return result; } - public AllocatableValue emitReinterpret(Kind to, Value inputVal) { + @Override + public AllocatableValue emitReinterpret(PlatformKind to, Value inputVal) { Kind from = inputVal.getKind(); AllocatableValue input = asAllocatable(inputVal); @@ -728,7 +735,7 @@ * Conversions between integer to floating point types require moves between CPU and FPU * registers. */ - switch (to) { + switch ((Kind) to) { case Int: switch (from) { case Float: diff -r d4a17336d121 -r 0c38906450a0 graal/com.oracle.graal.compiler.hsail/src/com/oracle/graal/compiler/hsail/HSAILLIRGenerator.java --- a/graal/com.oracle.graal.compiler.hsail/src/com/oracle/graal/compiler/hsail/HSAILLIRGenerator.java Fri Feb 21 12:59:52 2014 +0100 +++ b/graal/com.oracle.graal.compiler.hsail/src/com/oracle/graal/compiler/hsail/HSAILLIRGenerator.java Fri Feb 21 13:04:58 2014 +0100 @@ -679,7 +679,7 @@ } @Override - public Value emitReinterpret(Kind to, Value inputVal) { + public Value emitReinterpret(PlatformKind to, Value inputVal) { Variable result = newVariable(to); emitMove(result, inputVal); return result; diff -r d4a17336d121 -r 0c38906450a0 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 Fri Feb 21 12:59:52 2014 +0100 +++ b/graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java Fri Feb 21 13:04:58 2014 +0100 @@ -787,7 +787,8 @@ } } - public Value emitReinterpret(Kind to, Value inputVal) { + @Override + public Value emitReinterpret(PlatformKind to, Value inputVal) { Variable result = newVariable(to); emitMove(result, inputVal); return result; diff -r d4a17336d121 -r 0c38906450a0 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 Fri Feb 21 12:59:52 2014 +0100 +++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Fri Feb 21 13:04:58 2014 +0100 @@ -754,13 +754,13 @@ } } - private AllocatableValue emitConvertMove(Kind kind, AllocatableValue input) { + private AllocatableValue emitConvertMove(PlatformKind kind, AllocatableValue input) { Variable result = newVariable(kind); emitMove(result, input); return result; } - private AllocatableValue emitConvert2Op(Kind kind, SPARCArithmetic op, AllocatableValue input) { + private AllocatableValue emitConvert2Op(PlatformKind kind, SPARCArithmetic op, AllocatableValue input) { Variable result = newVariable(kind); append(new Unary2Op(op, result, input)); return result; @@ -861,12 +861,13 @@ } } - public AllocatableValue emitReinterpret(Kind to, Value inputVal) { + @Override + public AllocatableValue emitReinterpret(PlatformKind to, Value inputVal) { Kind from = inputVal.getKind(); AllocatableValue input = asAllocatable(inputVal); // These cases require a move between CPU and FPU registers: - switch (to) { + switch ((Kind) to) { case Int: switch (from) { case Float: diff -r d4a17336d121 -r 0c38906450a0 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Fri Feb 21 12:59:52 2014 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Fri Feb 21 13:04:58 2014 +0100 @@ -59,7 +59,7 @@ /** * This class traverses the HIR instructions and generates LIR instructions from them. */ -public abstract class LIRGenerator implements LIRGeneratorTool { +public abstract class LIRGenerator implements LIRGeneratorTool, LIRTypeTool { public static class Options { // @formatter:off @@ -338,13 +338,7 @@ */ @Override public Variable newVariable(PlatformKind platformKind) { - PlatformKind stackKind; - if (platformKind instanceof Kind) { - stackKind = ((Kind) platformKind).getStackKind(); - } else { - stackKind = platformKind; - } - return new Variable(stackKind, lir.nextVariable()); + return new Variable(platformKind, lir.nextVariable()); } @Override @@ -1018,6 +1012,36 @@ } } + /** + * Default implementation: Return the Java stack kind for each stamp. + */ + public PlatformKind getPlatformKind(Stamp stamp) { + return stamp.getPlatformKind(this); + } + + public PlatformKind getIntegerKind(int bits, boolean unsigned) { + if (bits > 32) { + return Kind.Long; + } else { + return Kind.Int; + } + } + + public PlatformKind getFloatingKind(int bits) { + switch (bits) { + case 32: + return Kind.Float; + case 64: + return Kind.Long; + default: + throw GraalInternalError.shouldNotReachHere(); + } + } + + public PlatformKind getObjectKind() { + return Kind.Object; + } + public abstract void emitBitCount(Variable result, Value operand); public abstract void emitBitScanForward(Variable result, Value operand); diff -r d4a17336d121 -r 0c38906450a0 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Fri Feb 21 12:59:52 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Fri Feb 21 13:04:58 2014 +0100 @@ -484,7 +484,7 @@ @Override public Variable emitLoad(Kind kind, Value address, Access access) { AMD64AddressValue loadAddress = asAddressValue(address); - Variable result = newVariable(kind); + Variable result = newVariable(kind.getStackKind()); LIRFrameState state = null; if (access instanceof DeoptimizingNode) { state = state((DeoptimizingNode) access); diff -r d4a17336d121 -r 0c38906450a0 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRegisterConfig.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRegisterConfig.java Fri Feb 21 12:59:52 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRegisterConfig.java Fri Feb 21 13:04:58 2014 +0100 @@ -216,7 +216,7 @@ } Kind returnKind = returnType == null ? Kind.Void : returnType.getKind(); - AllocatableValue returnLocation = returnKind == Kind.Void ? Value.ILLEGAL : getReturnRegister(returnKind).asValue(returnKind); + AllocatableValue returnLocation = returnKind == Kind.Void ? Value.ILLEGAL : getReturnRegister(returnKind).asValue(returnKind.getStackKind()); return new CallingConvention(currentStackOffset, returnLocation, locations); } diff -r d4a17336d121 -r 0c38906450a0 graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotLIRGenerator.java --- a/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotLIRGenerator.java Fri Feb 21 12:59:52 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotLIRGenerator.java Fri Feb 21 13:04:58 2014 +0100 @@ -132,7 +132,7 @@ @Override public Variable emitLoad(Kind kind, Value address, Access access) { HSAILAddressValue loadAddress = asAddressValue(address); - Variable result = newVariable(kind); + Variable result = newVariable(kind.getStackKind()); LIRFrameState state = null; if (access instanceof DeoptimizingNode) { state = state((DeoptimizingNode) access); diff -r d4a17336d121 -r 0c38906450a0 graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java Fri Feb 21 12:59:52 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java Fri Feb 21 13:04:58 2014 +0100 @@ -243,7 +243,7 @@ @Override public Variable emitLoad(Kind kind, Value address, Access access) { SPARCAddressValue loadAddress = asAddressValue(address); - Variable result = newVariable(kind); + Variable result = newVariable(kind.getStackKind()); LIRFrameState state = null; if (access instanceof DeoptimizingNode) { state = state((DeoptimizingNode) access); diff -r d4a17336d121 -r 0c38906450a0 graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotRegisterConfig.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotRegisterConfig.java Fri Feb 21 12:59:52 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotRegisterConfig.java Fri Feb 21 13:04:58 2014 +0100 @@ -208,7 +208,7 @@ } Kind returnKind = returnType == null ? Kind.Void : returnType.getKind(); - AllocatableValue returnLocation = returnKind == Kind.Void ? Value.ILLEGAL : getReturnRegister(returnKind, type).asValue(returnKind); + AllocatableValue returnLocation = returnKind == Kind.Void ? Value.ILLEGAL : getReturnRegister(returnKind, type).asValue(returnKind.getStackKind()); return new CallingConvention(currentStackOffset, returnLocation, locations); } diff -r d4a17336d121 -r 0c38906450a0 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/ArithmeticLIRGenerator.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/ArithmeticLIRGenerator.java Fri Feb 21 12:59:52 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/ArithmeticLIRGenerator.java Fri Feb 21 13:04:58 2014 +0100 @@ -25,6 +25,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.FloatConvertNode.FloatConvert; +import com.oracle.graal.nodes.type.*; /** * This interface can be used to generate LIR for arithmetic operations (@see @@ -36,6 +37,8 @@ Value setResult(ValueNode x, Value operand); + PlatformKind getPlatformKind(Stamp stamp); + Value emitNegate(Value input); Value emitAdd(Value a, Value b); @@ -68,7 +71,7 @@ Value emitFloatConvert(FloatConvert op, Value inputVal); - Value emitReinterpret(Kind to, Value inputVal); + Value emitReinterpret(PlatformKind to, Value inputVal); Value emitNarrow(Value inputVal, int bits); diff -r d4a17336d121 -r 0c38906450a0 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRTypeTool.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRTypeTool.java Fri Feb 21 13:04:58 2014 +0100 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.nodes.spi; + +import com.oracle.graal.api.meta.*; + +/** + * This interface can be used to access platform and VM specific kinds. + */ +public interface LIRTypeTool { + + PlatformKind getIntegerKind(int bits, boolean unsigned); + + PlatformKind getFloatingKind(int bits); + + PlatformKind getObjectKind(); +} diff -r d4a17336d121 -r 0c38906450a0 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/FloatStamp.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/FloatStamp.java Fri Feb 21 12:59:52 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/FloatStamp.java Fri Feb 21 13:04:58 2014 +0100 @@ -24,6 +24,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; +import com.oracle.graal.nodes.spi.*; public class FloatStamp extends PrimitiveStamp { @@ -58,6 +59,11 @@ } @Override + public PlatformKind getPlatformKind(LIRTypeTool tool) { + return tool.getFloatingKind(getBits()); + } + + @Override public ResolvedJavaType javaType(MetaAccessProvider metaAccess) { switch (getBits()) { case 32: diff -r d4a17336d121 -r 0c38906450a0 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/GenericStamp.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/GenericStamp.java Fri Feb 21 12:59:52 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/GenericStamp.java Fri Feb 21 13:04:58 2014 +0100 @@ -23,6 +23,8 @@ package com.oracle.graal.nodes.type; import com.oracle.graal.api.meta.*; +import com.oracle.graal.graph.*; +import com.oracle.graal.nodes.spi.*; public final class GenericStamp extends Stamp { @@ -55,6 +57,11 @@ } @Override + public PlatformKind getPlatformKind(LIRTypeTool tool) { + throw GraalInternalError.shouldNotReachHere(type + " stamp has no value"); + } + + @Override public ResolvedJavaType javaType(MetaAccessProvider metaAccess) { assert type == GenericStampType.Void; return metaAccess.lookupJavaType(Void.TYPE); diff -r d4a17336d121 -r 0c38906450a0 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/IllegalStamp.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/IllegalStamp.java Fri Feb 21 12:59:52 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/IllegalStamp.java Fri Feb 21 13:04:58 2014 +0100 @@ -23,6 +23,8 @@ package com.oracle.graal.nodes.type; import com.oracle.graal.api.meta.*; +import com.oracle.graal.graph.*; +import com.oracle.graal.nodes.spi.*; /** * This stamp represents the illegal type. Values with this type can not exist at run time. @@ -46,6 +48,11 @@ } @Override + public PlatformKind getPlatformKind(LIRTypeTool tool) { + throw GraalInternalError.shouldNotReachHere("illegal stamp should not reach backend"); + } + + @Override public Stamp unrestricted() { return this; } diff -r d4a17336d121 -r 0c38906450a0 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/IntegerStamp.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/IntegerStamp.java Fri Feb 21 12:59:52 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/IntegerStamp.java Fri Feb 21 13:04:58 2014 +0100 @@ -27,6 +27,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; /** * Describes the possible values of a {@link ValueNode} that produces an int or long result. @@ -74,6 +75,11 @@ } @Override + public PlatformKind getPlatformKind(LIRTypeTool tool) { + return tool.getIntegerKind(getBits(), unsigned); + } + + @Override public ResolvedJavaType javaType(MetaAccessProvider metaAccess) { switch (getBits()) { case 1: diff -r d4a17336d121 -r 0c38906450a0 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/ObjectStamp.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/ObjectStamp.java Fri Feb 21 12:59:52 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/ObjectStamp.java Fri Feb 21 13:04:58 2014 +0100 @@ -27,6 +27,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; public class ObjectStamp extends Stamp { @@ -54,6 +55,11 @@ } @Override + public PlatformKind getPlatformKind(LIRTypeTool tool) { + return tool.getObjectKind(); + } + + @Override public ResolvedJavaType javaType(MetaAccessProvider metaAccess) { if (type != null) { return type; diff -r d4a17336d121 -r 0c38906450a0 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/Stamp.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/Stamp.java Fri Feb 21 12:59:52 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/Stamp.java Fri Feb 21 13:04:58 2014 +0100 @@ -24,6 +24,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; /** * A stamp is the basis for a type system over the nodes in a graph. @@ -51,6 +52,12 @@ public abstract Kind getStackKind(); /** + * Gets a platform dependend {@link PlatformKind} that can be used to store a value of this + * stamp. + */ + public abstract PlatformKind getPlatformKind(LIRTypeTool tool); + + /** * Returns the union of this stamp and the given stamp. Typically used to create stamps for * {@link PhiNode}s. * diff -r d4a17336d121 -r 0c38906450a0 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ArrayEqualsNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ArrayEqualsNode.java Fri Feb 21 12:59:52 2014 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ArrayEqualsNode.java Fri Feb 21 13:04:58 2014 +0100 @@ -130,7 +130,7 @@ @Override public void generate(LIRGenerator gen) { - Variable result = gen.newVariable(Kind.Boolean); + Variable result = gen.newVariable(Kind.Int); gen.emitArrayEquals(kind, result, gen.operand(array1), gen.operand(array2), gen.operand(length)); gen.setResult(this, result); }