changeset 20845:258f80bce598

[SPARC] added InvocationPlugins for using HotSpot runtime math methods
author Doug Simon <doug.simon@oracle.com>
date Wed, 08 Apr 2015 22:23:22 +0200
parents 3081a57f95fd
children ac9d0db0716e
files graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackendFactory.java graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64MathIntrinsicNode.java graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64MathSubstitutions.java graal/com.oracle.graal.replacements.sparc/src/com/oracle/graal/replacements/sparc/SPARCGraphBuilderPlugins.java
diffstat 2 files changed, 39 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackendFactory.java	Wed Apr 08 22:09:05 2015 +0200
+++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackendFactory.java	Wed Apr 08 22:23:22 2015 +0200
@@ -79,10 +79,10 @@
     }
 
     protected Plugins createGraphBuilderPlugins(HotSpotGraalRuntimeProvider runtime, HotSpotMetaAccessProvider metaAccess, HotSpotConstantReflectionProvider constantReflection,
-                    HotSpotForeignCallsProvider foreignCalls, HotSpotStampProvider stampProvider, HotSpotSnippetReflectionProvider snippetReflection,
-                    HotSpotReplacementsImpl replacements, HotSpotWordTypes wordTypes) {
+                    HotSpotForeignCallsProvider foreignCalls, HotSpotStampProvider stampProvider, HotSpotSnippetReflectionProvider snippetReflection, HotSpotReplacementsImpl replacements,
+                    HotSpotWordTypes wordTypes) {
         Plugins plugins = HotSpotGraphBuilderPlugins.create(runtime.getConfig(), wordTypes, metaAccess, constantReflection, snippetReflection, foreignCalls, stampProvider, replacements);
-        SPARCGraphBuilderPlugins.register(plugins);
+        SPARCGraphBuilderPlugins.register(plugins, foreignCalls);
         return plugins;
     }
 
--- a/graal/com.oracle.graal.replacements.sparc/src/com/oracle/graal/replacements/sparc/SPARCGraphBuilderPlugins.java	Wed Apr 08 22:09:05 2015 +0200
+++ b/graal/com.oracle.graal.replacements.sparc/src/com/oracle/graal/replacements/sparc/SPARCGraphBuilderPlugins.java	Wed Apr 08 22:23:22 2015 +0200
@@ -22,18 +22,25 @@
  */
 package com.oracle.graal.replacements.sparc;
 
+import static com.oracle.graal.compiler.target.Backend.*;
+
+import com.oracle.graal.api.code.*;
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.graphbuilderconf.GraphBuilderConfiguration.Plugins;
 import com.oracle.graal.graphbuilderconf.*;
+import com.oracle.graal.graphbuilderconf.InvocationPlugins.Receiver;
 import com.oracle.graal.graphbuilderconf.InvocationPlugins.Registration;
+import com.oracle.graal.nodes.*;
+import com.oracle.graal.nodes.extended.*;
 import com.oracle.graal.replacements.*;
 
 public class SPARCGraphBuilderPlugins {
 
-    public static void register(Plugins plugins) {
+    public static void register(Plugins plugins, ForeignCallsProvider foreignCalls) {
         InvocationPlugins invocationPlugins = plugins.getInvocationPlugins();
         registerIntegerLongPlugins(invocationPlugins, IntegerSubstitutions.class, Kind.Int);
         registerIntegerLongPlugins(invocationPlugins, LongSubstitutions.class, Kind.Long);
+        registerMathPlugins(invocationPlugins, foreignCalls);
     }
 
     private static void registerIntegerLongPlugins(InvocationPlugins plugins, Class<?> substituteDeclaringClass, Kind kind) {
@@ -43,4 +50,32 @@
         r.registerMethodSubstitution(substituteDeclaringClass, "numberOfLeadingZeros", type);
         r.registerMethodSubstitution(substituteDeclaringClass, "numberOfTrailingZeros", type);
     }
+
+    static class MathRuntimeCallPlugin implements InvocationPlugin {
+        private final ForeignCallsProvider foreignCalls;
+        private final ForeignCallDescriptor descriptor;
+
+        public MathRuntimeCallPlugin(ForeignCallsProvider foreignCalls, ForeignCallDescriptor descriptor) {
+            this.foreignCalls = foreignCalls;
+            this.descriptor = descriptor;
+        }
+
+        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode value) {
+            b.addPush(new ForeignCallNode(foreignCalls, descriptor, value));
+            return true;
+        }
+
+        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode x, ValueNode y) {
+            b.addPush(new ForeignCallNode(foreignCalls, descriptor, x, y));
+            return true;
+        }
+    }
+
+    private static void registerMathPlugins(InvocationPlugins plugins, ForeignCallsProvider foreignCalls) {
+        Registration r = new Registration(plugins, Math.class);
+        r.register1("sin", Double.TYPE, new MathRuntimeCallPlugin(foreignCalls, ARITHMETIC_SIN));
+        r.register1("cos", Double.TYPE, new MathRuntimeCallPlugin(foreignCalls, ARITHMETIC_COS));
+        r.register1("tan", Double.TYPE, new MathRuntimeCallPlugin(foreignCalls, ARITHMETIC_TAN));
+        r.register2("pow", Double.TYPE, Double.TYPE, new MathRuntimeCallPlugin(foreignCalls, ARITHMETIC_POW));
+    }
 }