42 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext; 43 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin; 44 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin.Receiver; 45 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins; 46 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Registration; 47 import org.graalvm.compiler.nodes.java.AtomicReadAndAddNode; 48 import org.graalvm.compiler.nodes.java.AtomicReadAndWriteNode; 49 import org.graalvm.compiler.nodes.memory.address.AddressNode; 50 import org.graalvm.compiler.nodes.memory.address.OffsetAddressNode; 51 import org.graalvm.compiler.replacements.nodes.BinaryMathIntrinsicNode; 52 import org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode; 53 import org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation; 54 import jdk.internal.vm.compiler.word.LocationIdentity; 55 56 import jdk.vm.ci.meta.JavaKind; 57 import jdk.vm.ci.meta.ResolvedJavaMethod; 58 import sun.misc.Unsafe; 59 60 public class AArch64GraphBuilderPlugins { 61 62 public static void register(Plugins plugins, BytecodeProvider bytecodeProvider, boolean explicitUnsafeNullChecks, boolean registerMathPlugins) { 63 InvocationPlugins invocationPlugins = plugins.getInvocationPlugins(); 64 invocationPlugins.defer(new Runnable() { 65 @Override 66 public void run() { 67 registerIntegerLongPlugins(invocationPlugins, JavaKind.Int, bytecodeProvider); 68 registerIntegerLongPlugins(invocationPlugins, JavaKind.Long, bytecodeProvider); 69 if (registerMathPlugins) { 70 registerMathPlugins(invocationPlugins); 71 } 72 registerStringLatin1Plugins(invocationPlugins, bytecodeProvider); 73 registerStringUTF16Plugins(invocationPlugins, bytecodeProvider); 74 registerUnsafePlugins(invocationPlugins, bytecodeProvider); 75 // This is temporarily disabled until we implement correct emitting of the CAS 76 // instructions of the proper width. 77 registerPlatformSpecificUnsafePlugins(invocationPlugins, bytecodeProvider, explicitUnsafeNullChecks, 78 new JavaKind[]{JavaKind.Int, JavaKind.Long, JavaKind.Object}); 79 } 80 }); 81 } 82 83 private static void registerIntegerLongPlugins(InvocationPlugins plugins, JavaKind kind, BytecodeProvider bytecodeProvider) { 84 Class<?> declaringClass = kind.toBoxedJavaClass(); 85 Class<?> type = kind.toJavaClass(); 86 Registration r = new Registration(plugins, declaringClass, bytecodeProvider); 87 r.register1("numberOfLeadingZeros", type, new InvocationPlugin() { 88 @Override 89 public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode value) { 90 ValueNode folded = AArch64CountLeadingZerosNode.tryFold(value); 91 if (folded != null) { 92 b.addPush(JavaKind.Int, folded); 93 } else { | 42 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext; 43 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin; 44 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin.Receiver; 45 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins; 46 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Registration; 47 import org.graalvm.compiler.nodes.java.AtomicReadAndAddNode; 48 import org.graalvm.compiler.nodes.java.AtomicReadAndWriteNode; 49 import org.graalvm.compiler.nodes.memory.address.AddressNode; 50 import org.graalvm.compiler.nodes.memory.address.OffsetAddressNode; 51 import org.graalvm.compiler.replacements.nodes.BinaryMathIntrinsicNode; 52 import org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode; 53 import org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation; 54 import jdk.internal.vm.compiler.word.LocationIdentity; 55 56 import jdk.vm.ci.meta.JavaKind; 57 import jdk.vm.ci.meta.ResolvedJavaMethod; 58 import sun.misc.Unsafe; 59 60 public class AArch64GraphBuilderPlugins { 61 62 public static void register(Plugins plugins, BytecodeProvider bytecodeProvider, boolean explicitUnsafeNullChecks, 63 boolean registerMathPlugins) { 64 register(plugins, bytecodeProvider, explicitUnsafeNullChecks, registerMathPlugins, true); 65 } 66 67 public static void register(Plugins plugins, BytecodeProvider bytecodeProvider, boolean explicitUnsafeNullChecks, 68 boolean registerMathPlugins, boolean emitJDK9StringSubstitutions) { 69 InvocationPlugins invocationPlugins = plugins.getInvocationPlugins(); 70 invocationPlugins.defer(new Runnable() { 71 @Override 72 public void run() { 73 registerIntegerLongPlugins(invocationPlugins, JavaKind.Int, bytecodeProvider); 74 registerIntegerLongPlugins(invocationPlugins, JavaKind.Long, bytecodeProvider); 75 if (registerMathPlugins) { 76 registerMathPlugins(invocationPlugins); 77 } 78 if (emitJDK9StringSubstitutions) { 79 registerStringLatin1Plugins(invocationPlugins, bytecodeProvider); 80 registerStringUTF16Plugins(invocationPlugins, bytecodeProvider); 81 } 82 registerUnsafePlugins(invocationPlugins, bytecodeProvider); 83 // This is temporarily disabled until we implement correct emitting of the CAS 84 // instructions of the proper width. 85 registerPlatformSpecificUnsafePlugins(invocationPlugins, bytecodeProvider, explicitUnsafeNullChecks, 86 new JavaKind[]{JavaKind.Int, JavaKind.Long, JavaKind.Object}); 87 } 88 }); 89 } 90 91 private static void registerIntegerLongPlugins(InvocationPlugins plugins, JavaKind kind, BytecodeProvider bytecodeProvider) { 92 Class<?> declaringClass = kind.toBoxedJavaClass(); 93 Class<?> type = kind.toJavaClass(); 94 Registration r = new Registration(plugins, declaringClass, bytecodeProvider); 95 r.register1("numberOfLeadingZeros", type, new InvocationPlugin() { 96 @Override 97 public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode value) { 98 ValueNode folded = AArch64CountLeadingZerosNode.tryFold(value); 99 if (folded != null) { 100 b.addPush(JavaKind.Int, folded); 101 } else { |