Mercurial > hg > graal-compiler
view graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64GraphBuilderPlugins.java @ 22604:b00cc0475f31
Update jvmci import: Refactoring: Rename Kind to JavaKind.
author | Roland Schatz <roland.schatz@oracle.com> |
---|---|
date | Tue, 08 Sep 2015 19:57:39 +0200 |
parents | e02fa353e88c |
children | 05183a084a08 |
line wrap: on
line source
/* * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.oracle.graal.replacements.amd64; import jdk.internal.jvmci.amd64.*; import jdk.internal.jvmci.meta.*; import static com.oracle.graal.compiler.target.Backend.*; import static com.oracle.graal.replacements.amd64.AMD64MathIntrinsicNode.Operation.*; import sun.misc.*; import com.oracle.graal.compiler.common.spi.*; import com.oracle.graal.graphbuilderconf.*; import com.oracle.graal.graphbuilderconf.GraphBuilderConfiguration.Plugins; import com.oracle.graal.graphbuilderconf.InvocationPlugin.Receiver; import com.oracle.graal.graphbuilderconf.InvocationPlugins.Registration; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.java.*; import com.oracle.graal.nodes.memory.address.*; import com.oracle.graal.replacements.*; import com.oracle.graal.replacements.StandardGraphBuilderPlugins.*; public class AMD64GraphBuilderPlugins { public static void register(Plugins plugins, ForeignCallsProvider foreignCalls, AMD64 arch) { InvocationPlugins invocationPlugins = plugins.getInvocationPlugins(); registerIntegerLongPlugins(invocationPlugins, IntegerSubstitutions.class, JavaKind.Int, arch); registerIntegerLongPlugins(invocationPlugins, LongSubstitutions.class, JavaKind.Long, arch); registerUnsafePlugins(invocationPlugins); registerMathPlugins(invocationPlugins, foreignCalls); } private static void registerIntegerLongPlugins(InvocationPlugins plugins, Class<?> substituteDeclaringClass, JavaKind kind, AMD64 arch) { Class<?> declaringClass = kind.toBoxedJavaClass(); Class<?> type = kind.toJavaClass(); Registration r = new Registration(plugins, declaringClass); if (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); if (folded != null) { b.addPush(JavaKind.Int, folded); } else { b.addPush(JavaKind.Int, new AMD64CountLeadingZerosNode(value)); } return true; } }); } else { r.registerMethodSubstitution(substituteDeclaringClass, "numberOfLeadingZeros", type); } if (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); if (folded != null) { b.addPush(JavaKind.Int, folded); } else { b.addPush(JavaKind.Int, new AMD64CountTrailingZerosNode(value)); } return true; } }); } else { r.registerMethodSubstitution(substituteDeclaringClass, "numberOfTrailingZeros", type); } } 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) { b.push(JavaKind.Double, b.recursiveAppend(AMD64MathIntrinsicNode.create(value, LOG))); return true; } }); r.register1("log10", Double.TYPE, new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode value) { b.push(JavaKind.Double, b.recursiveAppend(AMD64MathIntrinsicNode.create(value, LOG10))); return true; } }); r.registerMethodSubstitution(AMD64MathSubstitutions.class, "sin", double.class); 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) { Registration r = new Registration(plugins, Unsafe.class); for (JavaKind kind : new JavaKind[]{JavaKind.Int, JavaKind.Long, JavaKind.Object}) { Class<?> javaClass = kind == JavaKind.Object ? Object.class : kind.toJavaClass(); r.register4("getAndSet" + kind.name(), Receiver.class, Object.class, long.class, javaClass, new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver unsafe, ValueNode object, ValueNode offset, ValueNode value) { // Emits a null-check for the otherwise unused receiver unsafe.get(); b.addPush(kind, new AtomicReadAndWriteNode(object, offset, value, kind, LocationIdentity.any())); b.getGraph().markUnsafeAccess(); return true; } }); if (kind != JavaKind.Object) { r.register4("getAndAdd" + kind.name(), Receiver.class, Object.class, long.class, javaClass, new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver unsafe, ValueNode object, ValueNode offset, ValueNode delta) { // Emits a null-check for the otherwise unused receiver unsafe.get(); AddressNode address = b.add(new OffsetAddressNode(object, offset)); b.addPush(kind, new AtomicReadAndAddNode(address, delta, LocationIdentity.any())); b.getGraph().markUnsafeAccess(); return true; } }); } } for (JavaKind kind : new JavaKind[]{JavaKind.Char, JavaKind.Short, JavaKind.Int, JavaKind.Long}) { Class<?> javaClass = kind.toJavaClass(); r.registerOptional3("get" + kind.name() + "Unaligned", Receiver.class, Object.class, long.class, new UnsafeGetPlugin(kind, false)); r.registerOptional4("put" + kind.name() + "Unaligned", Receiver.class, Object.class, long.class, javaClass, new UnsafePutPlugin(kind, false)); } } }