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)));