Mercurial > hg > graal-compiler
changeset 22706:8c20b80554d3
Correctly guard invocation plugins based on supported CPUFeature of AMD64
author | Christian Wimmer <christian.wimmer@oracle.com> |
---|---|
date | Fri, 25 Sep 2015 15:49:10 -0700 |
parents | 89520cbb9633 |
children | c839b1d02d89 |
files | graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64GraphBuilderPlugins.java graal/com.oracle.graal.replacements.sparc/src/com/oracle/graal/replacements/sparc/SPARCGraphBuilderPlugins.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StandardGraphBuilderPlugins.java |
diffstat | 3 files changed, 24 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64GraphBuilderPlugins.java Fri Sep 25 15:07:22 2015 -0700 +++ b/graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64GraphBuilderPlugins.java Fri Sep 25 15:49:10 2015 -0700 @@ -48,6 +48,7 @@ import com.oracle.graal.replacements.LongSubstitutions; import com.oracle.graal.replacements.StandardGraphBuilderPlugins.UnsafeGetPlugin; import com.oracle.graal.replacements.StandardGraphBuilderPlugins.UnsafePutPlugin; +import com.oracle.graal.replacements.nodes.BitCountNode; public class AMD64GraphBuilderPlugins { @@ -63,7 +64,7 @@ Class<?> declaringClass = kind.toBoxedJavaClass(); Class<?> type = kind.toJavaClass(); Registration r = new Registration(plugins, declaringClass); - if (arch.getFlags().contains(AMD64.Flag.UseCountLeadingZerosInstruction)) { + if (arch.getFeatures().contains(AMD64.CPUFeature.LZCNT) && arch.getFlags().contains(AMD64.Flag.UseCountLeadingZerosInstruction)) { r.register1("numberOfLeadingZeros", type, new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode value) { ValueNode folded = AMD64CountLeadingZerosNode.tryFold(value); @@ -78,7 +79,7 @@ } else { r.registerMethodSubstitution(substituteDeclaringClass, "numberOfLeadingZeros", type); } - if (arch.getFlags().contains(AMD64.Flag.UseCountTrailingZerosInstruction)) { + if (arch.getFeatures().contains(AMD64.CPUFeature.BMI1) && arch.getFlags().contains(AMD64.Flag.UseCountTrailingZerosInstruction)) { r.register1("numberOfTrailingZeros", type, new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode value) { ValueNode folded = AMD64CountTrailingZerosNode.tryFold(value); @@ -93,6 +94,15 @@ } else { r.registerMethodSubstitution(substituteDeclaringClass, "numberOfTrailingZeros", type); } + + if (arch.getFeatures().contains(AMD64.CPUFeature.POPCNT)) { + r.register1("bitCount", type, new InvocationPlugin() { + public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode value) { + b.push(JavaKind.Int, b.recursiveAppend(new BitCountNode(value).canonical(null, value))); + return true; + } + }); + } } private static void registerMathPlugins(InvocationPlugins plugins, ForeignCallsProvider foreignCalls) {
--- a/graal/com.oracle.graal.replacements.sparc/src/com/oracle/graal/replacements/sparc/SPARCGraphBuilderPlugins.java Fri Sep 25 15:07:22 2015 -0700 +++ b/graal/com.oracle.graal.replacements.sparc/src/com/oracle/graal/replacements/sparc/SPARCGraphBuilderPlugins.java Fri Sep 25 15:49:10 2015 -0700 @@ -30,14 +30,19 @@ import static com.oracle.graal.compiler.target.Backend.ARITHMETIC_SIN; import static com.oracle.graal.compiler.target.Backend.ARITHMETIC_TAN; import jdk.internal.jvmci.meta.JavaKind; +import jdk.internal.jvmci.meta.ResolvedJavaMethod; import com.oracle.graal.compiler.common.spi.ForeignCallsProvider; import com.oracle.graal.graphbuilderconf.ForeignCallPlugin; import com.oracle.graal.graphbuilderconf.GraphBuilderConfiguration.Plugins; +import com.oracle.graal.graphbuilderconf.GraphBuilderContext; +import com.oracle.graal.graphbuilderconf.InvocationPlugin; import com.oracle.graal.graphbuilderconf.InvocationPlugins; import com.oracle.graal.graphbuilderconf.InvocationPlugins.Registration; +import com.oracle.graal.nodes.ValueNode; import com.oracle.graal.replacements.IntegerSubstitutions; import com.oracle.graal.replacements.LongSubstitutions; +import com.oracle.graal.replacements.nodes.BitCountNode; public class SPARCGraphBuilderPlugins { @@ -54,6 +59,13 @@ Registration r = new Registration(plugins, declaringClass); r.registerMethodSubstitution(substituteDeclaringClass, "numberOfLeadingZeros", type); r.registerMethodSubstitution(substituteDeclaringClass, "numberOfTrailingZeros", type); + + r.register1("bitCount", type, new InvocationPlugin() { + public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode value) { + b.push(JavaKind.Int, b.recursiveAppend(new BitCountNode(value).canonical(null, value))); + return true; + } + }); } private static void registerMathPlugins(InvocationPlugins plugins, ForeignCallsProvider foreignCalls) {
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StandardGraphBuilderPlugins.java Fri Sep 25 15:07:22 2015 -0700 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StandardGraphBuilderPlugins.java Fri Sep 25 15:49:10 2015 -0700 @@ -96,7 +96,6 @@ import com.oracle.graal.nodes.java.RegisterFinalizerNode; import com.oracle.graal.nodes.util.GraphUtil; import com.oracle.graal.nodes.virtual.EnsureVirtualizedNode; -import com.oracle.graal.replacements.nodes.BitCountNode; import com.oracle.graal.replacements.nodes.DeferredPiNode; import com.oracle.graal.replacements.nodes.DirectReadNode; import com.oracle.graal.replacements.nodes.DirectStoreNode; @@ -252,12 +251,6 @@ return true; } }); - r.register1("bitCount", type, new InvocationPlugin() { - public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode value) { - b.push(JavaKind.Int, b.recursiveAppend(new BitCountNode(value).canonical(null, value))); - return true; - } - }); r.register2("divideUnsigned", type, type, new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode dividend, ValueNode divisor) { b.push(kind, b.recursiveAppend(new UnsignedDivNode(dividend, divisor).canonical(null, dividend, divisor)));