src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CheckGraalIntrinsics.java
changeset 52578 7dd81e82d083
parent 52220 9c260a6b6471
child 52910 583fd71c47d6
equal deleted inserted replaced
52577:5b87d3fc1093 52578:7dd81e82d083
   257                         "java/lang/reflect/Array.newArray(Ljava/lang/Class;I)Ljava/lang/Object;",
   257                         "java/lang/reflect/Array.newArray(Ljava/lang/Class;I)Ljava/lang/Object;",
   258                         // HotSpot MacroAssembler-based intrinsic
   258                         // HotSpot MacroAssembler-based intrinsic
   259                         "sun/nio/cs/ISO_8859_1$Encoder.encodeISOArray([CI[BII)I",
   259                         "sun/nio/cs/ISO_8859_1$Encoder.encodeISOArray([CI[BII)I",
   260                         // Stub based intrinsics but implementation seems complex in C2
   260                         // Stub based intrinsics but implementation seems complex in C2
   261                         "sun/security/provider/DigestBase.implCompressMultiBlock([BII)I");
   261                         "sun/security/provider/DigestBase.implCompressMultiBlock([BII)I");
       
   262 
       
   263         // See JDK-8207146.
       
   264         String oopName = isJDK12OrHigher() ? "Reference" : "Object";
   262 
   265 
   263         if (isJDK9OrHigher()) {
   266         if (isJDK9OrHigher()) {
   264             // Relevant for Java flight recorder
   267             // Relevant for Java flight recorder
   265             add(toBeInvestigated,
   268             add(toBeInvestigated,
   266                             "jdk/jfr/internal/JVM.counterTime()J",
   269                             "jdk/jfr/internal/JVM.counterTime()J",
   302              * Per default, all these operations are mapped to some generic method for which we
   305              * Per default, all these operations are mapped to some generic method for which we
   303              * already have compiler intrinsics. Performance-wise it would be better to support them
   306              * already have compiler intrinsics. Performance-wise it would be better to support them
   304              * explicitly as the more generic method might be more restrictive and therefore slower
   307              * explicitly as the more generic method might be more restrictive and therefore slower
   305              * than necessary.
   308              * than necessary.
   306              */
   309              */
       
   310 
   307             add(toBeInvestigated,
   311             add(toBeInvestigated,
   308                             // Mapped to compareAndExchange*
   312                             // Mapped to compareAndExchange*
   309                             "jdk/internal/misc/Unsafe.compareAndExchangeByteAcquire(Ljava/lang/Object;JBB)B",
   313                             "jdk/internal/misc/Unsafe.compareAndExchangeByteAcquire(Ljava/lang/Object;JBB)B",
   310                             "jdk/internal/misc/Unsafe.compareAndExchangeByteRelease(Ljava/lang/Object;JBB)B",
   314                             "jdk/internal/misc/Unsafe.compareAndExchangeByteRelease(Ljava/lang/Object;JBB)B",
   311                             "jdk/internal/misc/Unsafe.compareAndExchangeIntAcquire(Ljava/lang/Object;JII)I",
   315                             "jdk/internal/misc/Unsafe.compareAndExchangeIntAcquire(Ljava/lang/Object;JII)I",
   312                             "jdk/internal/misc/Unsafe.compareAndExchangeIntRelease(Ljava/lang/Object;JII)I",
   316                             "jdk/internal/misc/Unsafe.compareAndExchangeIntRelease(Ljava/lang/Object;JII)I",
   313                             "jdk/internal/misc/Unsafe.compareAndExchangeLongAcquire(Ljava/lang/Object;JJJ)J",
   317                             "jdk/internal/misc/Unsafe.compareAndExchangeLongAcquire(Ljava/lang/Object;JJJ)J",
   314                             "jdk/internal/misc/Unsafe.compareAndExchangeLongRelease(Ljava/lang/Object;JJJ)J",
   318                             "jdk/internal/misc/Unsafe.compareAndExchangeLongRelease(Ljava/lang/Object;JJJ)J",
   315                             "jdk/internal/misc/Unsafe.compareAndExchangeReferenceAcquire(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
   319                             "jdk/internal/misc/Unsafe.compareAndExchange" + oopName + "Acquire(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
   316                             "jdk/internal/misc/Unsafe.compareAndExchangeReferenceRelease(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
   320                             "jdk/internal/misc/Unsafe.compareAndExchange" + oopName + "Release(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
   317                             "jdk/internal/misc/Unsafe.compareAndExchangeShortAcquire(Ljava/lang/Object;JSS)S",
   321                             "jdk/internal/misc/Unsafe.compareAndExchangeShortAcquire(Ljava/lang/Object;JSS)S",
   318                             "jdk/internal/misc/Unsafe.compareAndExchangeShortRelease(Ljava/lang/Object;JSS)S",
   322                             "jdk/internal/misc/Unsafe.compareAndExchangeShortRelease(Ljava/lang/Object;JSS)S",
   319 
   323 
   320                             // Mapped to compareAndSet*
   324                             // Mapped to compareAndSet*
   321                             "jdk/internal/misc/Unsafe.weakCompareAndSetByte(Ljava/lang/Object;JBB)Z",
   325                             "jdk/internal/misc/Unsafe.weakCompareAndSetByte(Ljava/lang/Object;JBB)Z",
   328                             "jdk/internal/misc/Unsafe.weakCompareAndSetIntRelease(Ljava/lang/Object;JII)Z",
   332                             "jdk/internal/misc/Unsafe.weakCompareAndSetIntRelease(Ljava/lang/Object;JII)Z",
   329                             "jdk/internal/misc/Unsafe.weakCompareAndSetLong(Ljava/lang/Object;JJJ)Z",
   333                             "jdk/internal/misc/Unsafe.weakCompareAndSetLong(Ljava/lang/Object;JJJ)Z",
   330                             "jdk/internal/misc/Unsafe.weakCompareAndSetLongAcquire(Ljava/lang/Object;JJJ)Z",
   334                             "jdk/internal/misc/Unsafe.weakCompareAndSetLongAcquire(Ljava/lang/Object;JJJ)Z",
   331                             "jdk/internal/misc/Unsafe.weakCompareAndSetLongPlain(Ljava/lang/Object;JJJ)Z",
   335                             "jdk/internal/misc/Unsafe.weakCompareAndSetLongPlain(Ljava/lang/Object;JJJ)Z",
   332                             "jdk/internal/misc/Unsafe.weakCompareAndSetLongRelease(Ljava/lang/Object;JJJ)Z",
   336                             "jdk/internal/misc/Unsafe.weakCompareAndSetLongRelease(Ljava/lang/Object;JJJ)Z",
   333                             "jdk/internal/misc/Unsafe.weakCompareAndSetReference(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z",
   337                             "jdk/internal/misc/Unsafe.weakCompareAndSet" + oopName + "(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z",
   334                             "jdk/internal/misc/Unsafe.weakCompareAndSetReferenceAcquire(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z",
   338                             "jdk/internal/misc/Unsafe.weakCompareAndSet" + oopName + "Acquire(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z",
   335                             "jdk/internal/misc/Unsafe.weakCompareAndSetReferencePlain(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z",
   339                             "jdk/internal/misc/Unsafe.weakCompareAndSet" + oopName + "Plain(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z",
   336                             "jdk/internal/misc/Unsafe.weakCompareAndSetReferenceRelease(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z",
   340                             "jdk/internal/misc/Unsafe.weakCompareAndSet" + oopName + "Release(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z",
   337                             "jdk/internal/misc/Unsafe.weakCompareAndSetShort(Ljava/lang/Object;JSS)Z",
   341                             "jdk/internal/misc/Unsafe.weakCompareAndSetShort(Ljava/lang/Object;JSS)Z",
   338                             "jdk/internal/misc/Unsafe.weakCompareAndSetShortAcquire(Ljava/lang/Object;JSS)Z",
   342                             "jdk/internal/misc/Unsafe.weakCompareAndSetShortAcquire(Ljava/lang/Object;JSS)Z",
   339                             "jdk/internal/misc/Unsafe.weakCompareAndSetShortPlain(Ljava/lang/Object;JSS)Z",
   343                             "jdk/internal/misc/Unsafe.weakCompareAndSetShortPlain(Ljava/lang/Object;JSS)Z",
   340                             "jdk/internal/misc/Unsafe.weakCompareAndSetShortRelease(Ljava/lang/Object;JSS)Z");
   344                             "jdk/internal/misc/Unsafe.weakCompareAndSetShortRelease(Ljava/lang/Object;JSS)Z");
   341 
   345 
   342             // Compact string support - HotSpot MacroAssembler-based intrinsic or complex C2 logic.
   346             // Compact string support - HotSpot MacroAssembler-based intrinsic or complex C2 logic.
   343             add(toBeInvestigated,
   347             add(toBeInvestigated,
   344                             "java/lang/StringCoding.hasNegatives([BII)Z",
   348                             "java/lang/StringCoding.hasNegatives([BII)Z",
   345                             "java/lang/StringCoding.implEncodeISOArray([BI[BII)I",
   349                             "java/lang/StringCoding.implEncodeISOArray([BI[BII)I",
   346                             "java/lang/StringLatin1.indexOf([B[B)I",
   350                             "java/lang/StringLatin1.indexOf([B[B)I",
   347                             "java/lang/StringLatin1.inflate([BI[BII)V",
       
   348                             "java/lang/StringLatin1.inflate([BI[CII)V",
       
   349                             "java/lang/StringUTF16.compress([BI[BII)I",
       
   350                             "java/lang/StringUTF16.compress([CI[BII)I",
       
   351                             "java/lang/StringUTF16.getChar([BI)C",
   351                             "java/lang/StringUTF16.getChar([BI)C",
   352                             "java/lang/StringUTF16.getChars([BII[CI)V",
   352                             "java/lang/StringUTF16.getChars([BII[CI)V",
   353                             "java/lang/StringUTF16.indexOf([BI[BII)I",
   353                             "java/lang/StringUTF16.indexOf([BI[BII)I",
   354                             "java/lang/StringUTF16.indexOf([B[B)I",
   354                             "java/lang/StringUTF16.indexOf([B[B)I",
   355                             "java/lang/StringUTF16.indexOfChar([BIII)I",
   355                             "java/lang/StringUTF16.indexOfChar([BIII)I",
   385 
   385 
   386         if (!(arch instanceof AMD64)) {
   386         if (!(arch instanceof AMD64)) {
   387             // Can we implement these on non-AMD64 platforms? C2 seems to.
   387             // Can we implement these on non-AMD64 platforms? C2 seems to.
   388             add(toBeInvestigated,
   388             add(toBeInvestigated,
   389                             "java/lang/String.compareTo(Ljava/lang/String;)I",
   389                             "java/lang/String.compareTo(Ljava/lang/String;)I",
       
   390                             "java/lang/StringLatin1.inflate([BI[BII)V",
       
   391                             "java/lang/StringLatin1.inflate([BI[CII)V",
       
   392                             "java/lang/StringUTF16.compress([BI[BII)I",
       
   393                             "java/lang/StringUTF16.compress([CI[BII)I",
   390                             "jdk/internal/misc/Unsafe.compareAndExchangeByte(Ljava/lang/Object;JBB)B",
   394                             "jdk/internal/misc/Unsafe.compareAndExchangeByte(Ljava/lang/Object;JBB)B",
   391                             "jdk/internal/misc/Unsafe.compareAndExchangeShort(Ljava/lang/Object;JSS)S",
   395                             "jdk/internal/misc/Unsafe.compareAndExchangeShort(Ljava/lang/Object;JSS)S",
   392                             "jdk/internal/misc/Unsafe.compareAndSetByte(Ljava/lang/Object;JBB)Z",
   396                             "jdk/internal/misc/Unsafe.compareAndSetByte(Ljava/lang/Object;JBB)Z",
   393                             "jdk/internal/misc/Unsafe.compareAndSetShort(Ljava/lang/Object;JSS)Z",
   397                             "jdk/internal/misc/Unsafe.compareAndSetShort(Ljava/lang/Object;JSS)Z",
   394                             "jdk/internal/misc/Unsafe.getAndAddByte(Ljava/lang/Object;JB)B",
   398                             "jdk/internal/misc/Unsafe.getAndAddByte(Ljava/lang/Object;JB)B",
   397                             "jdk/internal/misc/Unsafe.getAndSetShort(Ljava/lang/Object;JS)S",
   401                             "jdk/internal/misc/Unsafe.getAndSetShort(Ljava/lang/Object;JS)S",
   398                             "sun/misc/Unsafe.getAndAddInt(Ljava/lang/Object;JI)I",
   402                             "sun/misc/Unsafe.getAndAddInt(Ljava/lang/Object;JI)I",
   399                             "sun/misc/Unsafe.getAndAddLong(Ljava/lang/Object;JJ)J",
   403                             "sun/misc/Unsafe.getAndAddLong(Ljava/lang/Object;JJ)J",
   400                             "sun/misc/Unsafe.getAndSetInt(Ljava/lang/Object;JI)I",
   404                             "sun/misc/Unsafe.getAndSetInt(Ljava/lang/Object;JI)I",
   401                             "sun/misc/Unsafe.getAndSetLong(Ljava/lang/Object;JJ)J",
   405                             "sun/misc/Unsafe.getAndSetLong(Ljava/lang/Object;JJ)J",
   402                             "sun/misc/Unsafe.getAndSetReference(Ljava/lang/Object;JLjava/lang/Object;)Ljava/lang/Object;");
   406                             "sun/misc/Unsafe.getAndSet" + oopName + "(Ljava/lang/Object;JLjava/lang/Object;)Ljava/lang/Object;");
   403 
   407 
   404             if (isJDK9OrHigher()) {
   408             if (isJDK9OrHigher()) {
   405                 if (!(arch instanceof AArch64)) {
   409                 if (!(arch instanceof AArch64)) {
   406                     add(toBeInvestigated,
   410                     add(toBeInvestigated,
   407                                     "java/lang/StringLatin1.compareTo([B[B)I",
   411                                     "java/lang/StringLatin1.compareTo([B[B)I",
   410                                     "java/lang/StringUTF16.compareToLatin1([B[B)I",
   414                                     "java/lang/StringUTF16.compareToLatin1([B[B)I",
   411                                     "jdk/internal/misc/Unsafe.getAndAddInt(Ljava/lang/Object;JI)I",
   415                                     "jdk/internal/misc/Unsafe.getAndAddInt(Ljava/lang/Object;JI)I",
   412                                     "jdk/internal/misc/Unsafe.getAndAddLong(Ljava/lang/Object;JJ)J",
   416                                     "jdk/internal/misc/Unsafe.getAndAddLong(Ljava/lang/Object;JJ)J",
   413                                     "jdk/internal/misc/Unsafe.getAndSetInt(Ljava/lang/Object;JI)I",
   417                                     "jdk/internal/misc/Unsafe.getAndSetInt(Ljava/lang/Object;JI)I",
   414                                     "jdk/internal/misc/Unsafe.getAndSetLong(Ljava/lang/Object;JJ)J",
   418                                     "jdk/internal/misc/Unsafe.getAndSetLong(Ljava/lang/Object;JJ)J",
   415                                     "jdk/internal/misc/Unsafe.getAndSetReference(Ljava/lang/Object;JLjava/lang/Object;)Ljava/lang/Object;");
   419                                     "jdk/internal/misc/Unsafe.getAndSet" + oopName + "(Ljava/lang/Object;JLjava/lang/Object;)Ljava/lang/Object;");
   416                 }
   420                 }
   417                 add(toBeInvestigated,
   421                 add(toBeInvestigated,
   418                                 "jdk/internal/misc/Unsafe.getCharUnaligned(Ljava/lang/Object;J)C",
   422                                 "jdk/internal/misc/Unsafe.getCharUnaligned(Ljava/lang/Object;J)C",
   419                                 "jdk/internal/misc/Unsafe.getIntUnaligned(Ljava/lang/Object;J)I",
   423                                 "jdk/internal/misc/Unsafe.getIntUnaligned(Ljava/lang/Object;J)I",
   420                                 "jdk/internal/misc/Unsafe.getLongUnaligned(Ljava/lang/Object;J)J",
   424                                 "jdk/internal/misc/Unsafe.getLongUnaligned(Ljava/lang/Object;J)J",
   523         return GraalServices.JAVA_SPECIFICATION_VERSION >= 10;
   527         return GraalServices.JAVA_SPECIFICATION_VERSION >= 10;
   524     }
   528     }
   525 
   529 
   526     private static boolean isJDK11OrHigher() {
   530     private static boolean isJDK11OrHigher() {
   527         return GraalServices.JAVA_SPECIFICATION_VERSION >= 11;
   531         return GraalServices.JAVA_SPECIFICATION_VERSION >= 11;
       
   532     }
       
   533 
       
   534     private static boolean isJDK12OrHigher() {
       
   535         return GraalServices.JAVA_SPECIFICATION_VERSION >= 12;
   528     }
   536     }
   529 
   537 
   530     public interface Refiner {
   538     public interface Refiner {
   531         void refine(CheckGraalIntrinsics checker);
   539         void refine(CheckGraalIntrinsics checker);
   532     }
   540     }