diff graal/com.oracle.graal.replacements.sparc/src/com/oracle/graal/replacements/sparc/SPARCGraphBuilderPlugins.java @ 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 a2cd0e7072e2
children 74f8a2ec0844
line wrap: on
line diff
--- 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));
+    }
 }