44 import org.graalvm.compiler.hotspot.meta.HotSpotGraphBuilderPlugins;
45 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
46 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins;
47 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin;
48 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins;
49 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Binding;
50 import org.graalvm.compiler.runtime.RuntimeProvider;
51 import org.graalvm.compiler.serviceprovider.JavaVersionUtil;
52 import org.graalvm.compiler.test.GraalTest;
53 import org.junit.Test;
54
55 import jdk.vm.ci.aarch64.AArch64;
56 import jdk.vm.ci.amd64.AMD64;
57 import jdk.vm.ci.code.Architecture;
58 import jdk.vm.ci.hotspot.HotSpotVMConfigStore;
59 import jdk.vm.ci.hotspot.VMIntrinsicMethod;
60 import jdk.vm.ci.meta.MetaAccessProvider;
61 import jdk.vm.ci.meta.MetaUtil;
62 import jdk.vm.ci.meta.MethodHandleAccessProvider.IntrinsicMethod;
63 import jdk.vm.ci.meta.ResolvedJavaMethod;
64 import jdk.vm.ci.sparc.SPARC;
65
66 /**
67 * Checks the intrinsics implemented by Graal against the set of intrinsics declared by HotSpot. The
68 * purpose of this test is to detect when new intrinsics are added to HotSpot and process them
69 * appropriately in Graal. This will be achieved by working through {@link #toBeInvestigated} and
70 * either implementing the intrinsic or moving it to {@link #ignore} .
71 */
72 public class CheckGraalIntrinsics extends GraalTest {
73
74 public static boolean match(String type, Binding binding, VMIntrinsicMethod intrinsic) {
75 if (intrinsic.name.equals(binding.name)) {
76 if (intrinsic.descriptor.startsWith(binding.argumentsDescriptor)) {
77 if (type.equals(intrinsic.declaringClass)) {
78 return true;
79 }
80 }
81 }
82 return false;
83 }
84
354 "java/lang/StringUTF16.indexOf([BI[BII)I",
355 "java/lang/StringUTF16.indexOf([B[B)I",
356
357 // handled by an intrinsic for StringUTF16.indexOfCharUnsafe
358 "java/lang/StringUTF16.indexOfChar([BIII)I",
359
360 // handled by an intrinsic for StringUTF16.indexOfLatin1Unsafe
361 "java/lang/StringUTF16.indexOfLatin1([BI[BII)I",
362 "java/lang/StringUTF16.indexOfLatin1([B[B)I");
363
364 if (!config.useAESCTRIntrinsics) {
365 add(ignore,
366 "com/sun/crypto/provider/CounterMode.implCrypt([BII[BI)I");
367 }
368 if (!config.useGHASHIntrinsics()) {
369 add(ignore,
370 "com/sun/crypto/provider/GHASH.processBlocks([BII[J[J)V");
371 }
372 if (!config.useFMAIntrinsics) {
373 add(ignore,
374 "java/lang/Math.fma(DDD)D",
375 "java/lang/Math.fma(FFF)F");
376 } else if (arch instanceof SPARC) {
377 add(toBeInvestigated,
378 "java/lang/Math.fma(DDD)D",
379 "java/lang/Math.fma(FFF)F");
380 }
381 }
382
383 if (isJDK10OrHigher()) {
384 add(toBeInvestigated,
385 "java/lang/Math.multiplyHigh(JJ)J");
386 }
387
388 if (isJDK11OrHigher()) {
389 // Relevant for Java flight recorder
390 add(toBeInvestigated,
391 "java/lang/CharacterDataLatin1.isDigit(I)Z",
392 "java/lang/CharacterDataLatin1.isLowerCase(I)Z",
393 "java/lang/CharacterDataLatin1.isUpperCase(I)Z",
394 "java/lang/CharacterDataLatin1.isWhitespace(I)Z",
395 "jdk/jfr/internal/JVM.getEventWriter()Ljava/lang/Object;");
396 if (!config.useBase64Intrinsics()) {
397 add(ignore,
|
44 import org.graalvm.compiler.hotspot.meta.HotSpotGraphBuilderPlugins;
45 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
46 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins;
47 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin;
48 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins;
49 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Binding;
50 import org.graalvm.compiler.runtime.RuntimeProvider;
51 import org.graalvm.compiler.serviceprovider.JavaVersionUtil;
52 import org.graalvm.compiler.test.GraalTest;
53 import org.junit.Test;
54
55 import jdk.vm.ci.aarch64.AArch64;
56 import jdk.vm.ci.amd64.AMD64;
57 import jdk.vm.ci.code.Architecture;
58 import jdk.vm.ci.hotspot.HotSpotVMConfigStore;
59 import jdk.vm.ci.hotspot.VMIntrinsicMethod;
60 import jdk.vm.ci.meta.MetaAccessProvider;
61 import jdk.vm.ci.meta.MetaUtil;
62 import jdk.vm.ci.meta.MethodHandleAccessProvider.IntrinsicMethod;
63 import jdk.vm.ci.meta.ResolvedJavaMethod;
64
65 /**
66 * Checks the intrinsics implemented by Graal against the set of intrinsics declared by HotSpot. The
67 * purpose of this test is to detect when new intrinsics are added to HotSpot and process them
68 * appropriately in Graal. This will be achieved by working through {@link #toBeInvestigated} and
69 * either implementing the intrinsic or moving it to {@link #ignore} .
70 */
71 public class CheckGraalIntrinsics extends GraalTest {
72
73 public static boolean match(String type, Binding binding, VMIntrinsicMethod intrinsic) {
74 if (intrinsic.name.equals(binding.name)) {
75 if (intrinsic.descriptor.startsWith(binding.argumentsDescriptor)) {
76 if (type.equals(intrinsic.declaringClass)) {
77 return true;
78 }
79 }
80 }
81 return false;
82 }
83
353 "java/lang/StringUTF16.indexOf([BI[BII)I",
354 "java/lang/StringUTF16.indexOf([B[B)I",
355
356 // handled by an intrinsic for StringUTF16.indexOfCharUnsafe
357 "java/lang/StringUTF16.indexOfChar([BIII)I",
358
359 // handled by an intrinsic for StringUTF16.indexOfLatin1Unsafe
360 "java/lang/StringUTF16.indexOfLatin1([BI[BII)I",
361 "java/lang/StringUTF16.indexOfLatin1([B[B)I");
362
363 if (!config.useAESCTRIntrinsics) {
364 add(ignore,
365 "com/sun/crypto/provider/CounterMode.implCrypt([BII[BI)I");
366 }
367 if (!config.useGHASHIntrinsics()) {
368 add(ignore,
369 "com/sun/crypto/provider/GHASH.processBlocks([BII[J[J)V");
370 }
371 if (!config.useFMAIntrinsics) {
372 add(ignore,
373 "java/lang/Math.fma(DDD)D",
374 "java/lang/Math.fma(FFF)F");
375 }
376 }
377
378 if (isJDK10OrHigher()) {
379 add(toBeInvestigated,
380 "java/lang/Math.multiplyHigh(JJ)J");
381 }
382
383 if (isJDK11OrHigher()) {
384 // Relevant for Java flight recorder
385 add(toBeInvestigated,
386 "java/lang/CharacterDataLatin1.isDigit(I)Z",
387 "java/lang/CharacterDataLatin1.isLowerCase(I)Z",
388 "java/lang/CharacterDataLatin1.isUpperCase(I)Z",
389 "java/lang/CharacterDataLatin1.isWhitespace(I)Z",
390 "jdk/jfr/internal/JVM.getEventWriter()Ljava/lang/Object;");
391 if (!config.useBase64Intrinsics()) {
392 add(ignore,
|