diff graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64GraphBuilderPlugins.java @ 20858:9e8f6d379720

added InvocationPlugins to use recently exposed HotSpot math runtime functions
author Doug Simon <doug.simon@oracle.com>
date Wed, 08 Apr 2015 22:57:48 +0200
parents 3081a57f95fd
children dc58f4ca21c9
line wrap: on
line diff
--- a/graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64GraphBuilderPlugins.java	Wed Apr 08 22:53:08 2015 +0200
+++ b/graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64GraphBuilderPlugins.java	Wed Apr 08 22:57:48 2015 +0200
@@ -22,10 +22,12 @@
  */
 package com.oracle.graal.replacements.amd64;
 
+import static com.oracle.graal.compiler.target.Backend.*;
 import static com.oracle.graal.replacements.amd64.AMD64MathIntrinsicNode.Operation.*;
 import sun.misc.*;
 
 import com.oracle.graal.amd64.*;
+import com.oracle.graal.api.code.*;
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.graphbuilderconf.GraphBuilderConfiguration.Plugins;
 import com.oracle.graal.graphbuilderconf.*;
@@ -37,12 +39,12 @@
 
 public class AMD64GraphBuilderPlugins {
 
-    public static void register(Plugins plugins, AMD64 arch) {
+    public static void register(Plugins plugins, ForeignCallsProvider foreignCalls, AMD64 arch) {
         InvocationPlugins invocationPlugins = plugins.getInvocationPlugins();
         registerIntegerLongPlugins(invocationPlugins, IntegerSubstitutions.class, Kind.Int, arch);
         registerIntegerLongPlugins(invocationPlugins, LongSubstitutions.class, Kind.Long, arch);
         registerUnsafePlugins(invocationPlugins);
-        registerMathPlugins(invocationPlugins);
+        registerMathPlugins(invocationPlugins, foreignCalls);
     }
 
     private static void registerIntegerLongPlugins(InvocationPlugins plugins, Class<?> substituteDeclaringClass, Kind kind, AMD64 arch) {
@@ -81,7 +83,7 @@
         }
     }
 
-    private static void registerMathPlugins(InvocationPlugins plugins) {
+    private static void registerMathPlugins(InvocationPlugins plugins, ForeignCallsProvider foreignCalls) {
         Registration r = new Registration(plugins, Math.class);
         r.register1("log", Double.TYPE, new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode value) {
@@ -99,6 +101,7 @@
         r.registerMethodSubstitution(AMD64MathSubstitutions.class, "cos", double.class);
         r.registerMethodSubstitution(AMD64MathSubstitutions.class, "tan", double.class);
         r.registerMethodSubstitution(AMD64MathSubstitutions.class, "pow", double.class, double.class);
+        r.register1("exp", Double.TYPE, new ForeignCallPlugin(foreignCalls, ARITHMETIC_EXP));
     }
 
     private static void registerUnsafePlugins(InvocationPlugins plugins) {