30 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.LOG; |
30 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.LOG; |
31 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.LOG10; |
31 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.LOG10; |
32 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.SIN; |
32 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.SIN; |
33 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.TAN; |
33 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.TAN; |
34 import static org.graalvm.compiler.serviceprovider.GraalServices.JAVA_SPECIFICATION_VERSION; |
34 import static org.graalvm.compiler.serviceprovider.GraalServices.JAVA_SPECIFICATION_VERSION; |
|
35 import static org.graalvm.compiler.serviceprovider.GraalServices.Java11OrEarlier; |
35 import static org.graalvm.compiler.serviceprovider.GraalServices.Java8OrEarlier; |
36 import static org.graalvm.compiler.serviceprovider.GraalServices.Java8OrEarlier; |
36 |
37 |
37 import org.graalvm.compiler.bytecode.BytecodeProvider; |
38 import org.graalvm.compiler.bytecode.BytecodeProvider; |
38 import org.graalvm.compiler.lir.aarch64.AArch64ArithmeticLIRGeneratorTool.RoundingMode; |
39 import org.graalvm.compiler.lir.aarch64.AArch64ArithmeticLIRGeneratorTool.RoundingMode; |
39 import org.graalvm.compiler.nodes.ValueNode; |
40 import org.graalvm.compiler.nodes.ValueNode; |
177 unsafeJavaKinds = new JavaKind[]{JavaKind.Int, JavaKind.Long, JavaKind.Object}; |
178 unsafeJavaKinds = new JavaKind[]{JavaKind.Int, JavaKind.Long, JavaKind.Object}; |
178 } |
179 } |
179 |
180 |
180 for (JavaKind kind : unsafeJavaKinds) { |
181 for (JavaKind kind : unsafeJavaKinds) { |
181 Class<?> javaClass = kind == JavaKind.Object ? Object.class : kind.toJavaClass(); |
182 Class<?> javaClass = kind == JavaKind.Object ? Object.class : kind.toJavaClass(); |
182 |
183 String kindName = (kind == JavaKind.Object && !Java11OrEarlier) ? "Reference" : kind.name(); |
183 r.register4("getAndSet" + kind.name(), Receiver.class, Object.class, long.class, javaClass, new InvocationPlugin() { |
184 r.register4("getAndSet" + kindName, Receiver.class, Object.class, long.class, javaClass, new InvocationPlugin() { |
184 @Override |
185 @Override |
185 public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver unsafe, ValueNode object, ValueNode offset, ValueNode value) { |
186 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 // Emits a null-check for the otherwise unused receiver |
187 unsafe.get(); |
188 unsafe.get(); |
188 b.addPush(kind, new AtomicReadAndWriteNode(object, offset, value, kind, LocationIdentity.any())); |
189 b.addPush(kind, new AtomicReadAndWriteNode(object, offset, value, kind, LocationIdentity.any())); |
190 return true; |
191 return true; |
191 } |
192 } |
192 }); |
193 }); |
193 |
194 |
194 if (kind != JavaKind.Boolean && kind.isNumericInteger()) { |
195 if (kind != JavaKind.Boolean && kind.isNumericInteger()) { |
195 r.register4("getAndAdd" + kind.name(), Receiver.class, Object.class, long.class, javaClass, new InvocationPlugin() { |
196 r.register4("getAndAdd" + kindName, Receiver.class, Object.class, long.class, javaClass, new InvocationPlugin() { |
196 @Override |
197 @Override |
197 public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver unsafe, ValueNode object, ValueNode offset, ValueNode delta) { |
198 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 // Emits a null-check for the otherwise unused receiver |
199 unsafe.get(); |
200 unsafe.get(); |
200 AddressNode address = b.add(new OffsetAddressNode(object, offset)); |
201 AddressNode address = b.add(new OffsetAddressNode(object, offset)); |