< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64GraphBuilderPlugins.java

Print this page




  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 
  25 package org.graalvm.compiler.replacements.aarch64;
  26 
  27 import static org.graalvm.compiler.replacements.StandardGraphBuilderPlugins.registerPlatformSpecificUnsafePlugins;
  28 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.COS;
  29 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.EXP;
  30 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.LOG;
  31 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.LOG10;
  32 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.SIN;
  33 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.TAN;
  34 import static org.graalvm.compiler.serviceprovider.GraalServices.JAVA_SPECIFICATION_VERSION;

  35 import static org.graalvm.compiler.serviceprovider.GraalServices.Java8OrEarlier;
  36 
  37 import org.graalvm.compiler.bytecode.BytecodeProvider;
  38 import org.graalvm.compiler.lir.aarch64.AArch64ArithmeticLIRGeneratorTool.RoundingMode;
  39 import org.graalvm.compiler.nodes.ValueNode;
  40 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins;
  41 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext;
  42 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin;
  43 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin.Receiver;
  44 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins;
  45 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Registration;
  46 import org.graalvm.compiler.nodes.java.AtomicReadAndAddNode;
  47 import org.graalvm.compiler.nodes.java.AtomicReadAndWriteNode;
  48 import org.graalvm.compiler.nodes.memory.address.AddressNode;
  49 import org.graalvm.compiler.nodes.memory.address.OffsetAddressNode;
  50 import org.graalvm.compiler.replacements.nodes.BinaryMathIntrinsicNode;
  51 import org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode;
  52 import org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation;
  53 import jdk.internal.vm.compiler.word.LocationIdentity;
  54 


 162             Registration r = new Registration(plugins, "java.lang.StringUTF16", replacementsBytecodeProvider);
 163             r.setAllowOverwrite(true);
 164             r.registerMethodSubstitution(AArch64StringUTF16Substitutions.class, "compareTo", byte[].class, byte[].class);
 165             r.registerMethodSubstitution(AArch64StringUTF16Substitutions.class, "compareToLatin1", byte[].class, byte[].class);
 166         }
 167     }
 168 
 169     private static void registerUnsafePlugins(InvocationPlugins plugins, BytecodeProvider replacementsBytecodeProvider) {
 170         Registration r;
 171         JavaKind[] unsafeJavaKinds;
 172         if (Java8OrEarlier) {
 173             r = new Registration(plugins, Unsafe.class);
 174             unsafeJavaKinds = new JavaKind[]{JavaKind.Int, JavaKind.Long, JavaKind.Object};
 175         } else {
 176             r = new Registration(plugins, "jdk.internal.misc.Unsafe", replacementsBytecodeProvider);
 177             unsafeJavaKinds = new JavaKind[]{JavaKind.Int, JavaKind.Long, JavaKind.Object};
 178         }
 179 
 180         for (JavaKind kind : unsafeJavaKinds) {
 181             Class<?> javaClass = kind == JavaKind.Object ? Object.class : kind.toJavaClass();
 182 
 183             r.register4("getAndSet" + kind.name(), Receiver.class, Object.class, long.class, javaClass, new InvocationPlugin() {
 184                 @Override
 185                 public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver unsafe, ValueNode object, ValueNode offset, ValueNode value) {
 186                     // Emits a null-check for the otherwise unused receiver
 187                     unsafe.get();
 188                     b.addPush(kind, new AtomicReadAndWriteNode(object, offset, value, kind, LocationIdentity.any()));
 189                     b.getGraph().markUnsafeAccess();
 190                     return true;
 191                 }
 192             });
 193 
 194             if (kind != JavaKind.Boolean && kind.isNumericInteger()) {
 195                 r.register4("getAndAdd" + kind.name(), Receiver.class, Object.class, long.class, javaClass, new InvocationPlugin() {
 196                     @Override
 197                     public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver unsafe, ValueNode object, ValueNode offset, ValueNode delta) {
 198                         // Emits a null-check for the otherwise unused receiver
 199                         unsafe.get();
 200                         AddressNode address = b.add(new OffsetAddressNode(object, offset));
 201                         b.addPush(kind, new AtomicReadAndAddNode(address, delta, kind, LocationIdentity.any()));
 202                         b.getGraph().markUnsafeAccess();
 203                         return true;
 204                     }
 205                 });
 206             }
 207         }
 208     }
 209 }


  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 
  25 package org.graalvm.compiler.replacements.aarch64;
  26 
  27 import static org.graalvm.compiler.replacements.StandardGraphBuilderPlugins.registerPlatformSpecificUnsafePlugins;
  28 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.COS;
  29 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.EXP;
  30 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.LOG;
  31 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.LOG10;
  32 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.SIN;
  33 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.TAN;
  34 import static org.graalvm.compiler.serviceprovider.GraalServices.JAVA_SPECIFICATION_VERSION;
  35 import static org.graalvm.compiler.serviceprovider.GraalServices.Java11OrEarlier;
  36 import static org.graalvm.compiler.serviceprovider.GraalServices.Java8OrEarlier;
  37 
  38 import org.graalvm.compiler.bytecode.BytecodeProvider;
  39 import org.graalvm.compiler.lir.aarch64.AArch64ArithmeticLIRGeneratorTool.RoundingMode;
  40 import org.graalvm.compiler.nodes.ValueNode;
  41 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins;
  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 


 163             Registration r = new Registration(plugins, "java.lang.StringUTF16", replacementsBytecodeProvider);
 164             r.setAllowOverwrite(true);
 165             r.registerMethodSubstitution(AArch64StringUTF16Substitutions.class, "compareTo", byte[].class, byte[].class);
 166             r.registerMethodSubstitution(AArch64StringUTF16Substitutions.class, "compareToLatin1", byte[].class, byte[].class);
 167         }
 168     }
 169 
 170     private static void registerUnsafePlugins(InvocationPlugins plugins, BytecodeProvider replacementsBytecodeProvider) {
 171         Registration r;
 172         JavaKind[] unsafeJavaKinds;
 173         if (Java8OrEarlier) {
 174             r = new Registration(plugins, Unsafe.class);
 175             unsafeJavaKinds = new JavaKind[]{JavaKind.Int, JavaKind.Long, JavaKind.Object};
 176         } else {
 177             r = new Registration(plugins, "jdk.internal.misc.Unsafe", replacementsBytecodeProvider);
 178             unsafeJavaKinds = new JavaKind[]{JavaKind.Int, JavaKind.Long, JavaKind.Object};
 179         }
 180 
 181         for (JavaKind kind : unsafeJavaKinds) {
 182             Class<?> javaClass = kind == JavaKind.Object ? Object.class : kind.toJavaClass();
 183             String kindName = (kind == JavaKind.Object && !Java11OrEarlier) ? "Reference" : kind.name();
 184             r.register4("getAndSet" + kindName, Receiver.class, Object.class, long.class, javaClass, new InvocationPlugin() {
 185                 @Override
 186                 public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver unsafe, ValueNode object, ValueNode offset, ValueNode value) {
 187                     // Emits a null-check for the otherwise unused receiver
 188                     unsafe.get();
 189                     b.addPush(kind, new AtomicReadAndWriteNode(object, offset, value, kind, LocationIdentity.any()));
 190                     b.getGraph().markUnsafeAccess();
 191                     return true;
 192                 }
 193             });
 194 
 195             if (kind != JavaKind.Boolean && kind.isNumericInteger()) {
 196                 r.register4("getAndAdd" + kindName, Receiver.class, Object.class, long.class, javaClass, new InvocationPlugin() {
 197                     @Override
 198                     public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver unsafe, ValueNode object, ValueNode offset, ValueNode delta) {
 199                         // Emits a null-check for the otherwise unused receiver
 200                         unsafe.get();
 201                         AddressNode address = b.add(new OffsetAddressNode(object, offset));
 202                         b.addPush(kind, new AtomicReadAndAddNode(address, delta, kind, LocationIdentity.any()));
 203                         b.getGraph().markUnsafeAccess();
 204                         return true;
 205                     }
 206                 });
 207             }
 208         }
 209     }
 210 }
< prev index next >