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 }
|