195 Registration r;
196 r = new Registration(plugins, String.class, replacementsBytecodeProvider);
197 r.setAllowOverwrite(true);
198 if (arch.getFeatures().contains(CPUFeature.SSE4_2)) {
199 r.registerMethodSubstitution(AMD64StringSubstitutions.class, "indexOf", char[].class, int.class,
200 int.class, char[].class, int.class, int.class, int.class);
201 }
202 if (arch.getFeatures().contains(CPUFeature.SSSE3)) {
203 r.registerMethodSubstitution(AMD64StringSubstitutions.class, "indexOf", Receiver.class, int.class, int.class);
204 }
205 r.registerMethodSubstitution(AMD64StringSubstitutions.class, "compareTo", Receiver.class, String.class);
206 }
207 }
208
209 private static void registerStringLatin1Plugins(InvocationPlugins plugins, AMD64 arch, BytecodeProvider replacementsBytecodeProvider) {
210 if (JAVA_SPECIFICATION_VERSION >= 9) {
211 Registration r = new Registration(plugins, "java.lang.StringLatin1", replacementsBytecodeProvider);
212 r.setAllowOverwrite(true);
213 r.registerMethodSubstitution(AMD64StringLatin1Substitutions.class, "compareTo", byte[].class, byte[].class);
214 r.registerMethodSubstitution(AMD64StringLatin1Substitutions.class, "compareToUTF16", byte[].class, byte[].class);
215 if (arch.getFeatures().contains(CPUFeature.SSSE3)) {
216 r.registerMethodSubstitution(AMD64StringLatin1Substitutions.class, "indexOf", byte[].class, int.class, int.class);
217 }
218 }
219 }
220
221 private static void registerStringUTF16Plugins(InvocationPlugins plugins, AMD64 arch, BytecodeProvider replacementsBytecodeProvider) {
222 if (JAVA_SPECIFICATION_VERSION >= 9) {
223 Registration r = new Registration(plugins, "java.lang.StringUTF16", replacementsBytecodeProvider);
224 r.setAllowOverwrite(true);
225 r.registerMethodSubstitution(AMD64StringUTF16Substitutions.class, "compareTo", byte[].class, byte[].class);
226 r.registerMethodSubstitution(AMD64StringUTF16Substitutions.class, "compareToLatin1", byte[].class, byte[].class);
227 if (arch.getFeatures().contains(CPUFeature.SSSE3)) {
228 r.registerMethodSubstitution(AMD64StringUTF16Substitutions.class, "indexOfCharUnsafe", byte[].class, int.class, int.class, int.class);
229 }
230 }
231 }
232
233 private static void registerUnsafePlugins(InvocationPlugins plugins, BytecodeProvider replacementsBytecodeProvider, boolean explicitUnsafeNullChecks) {
234 registerUnsafePlugins(new Registration(plugins, Unsafe.class), explicitUnsafeNullChecks, new JavaKind[]{JavaKind.Int, JavaKind.Long, JavaKind.Object}, true);
235 if (!Java8OrEarlier) {
236 registerUnsafePlugins(new Registration(plugins, "jdk.internal.misc.Unsafe", replacementsBytecodeProvider), explicitUnsafeNullChecks,
237 new JavaKind[]{JavaKind.Boolean, JavaKind.Byte, JavaKind.Char, JavaKind.Short, JavaKind.Int, JavaKind.Long, JavaKind.Object}, Java11OrEarlier);
238 }
239 }
240
241 private static void registerUnsafePlugins(Registration r, boolean explicitUnsafeNullChecks, JavaKind[] unsafeJavaKinds, boolean java11OrEarlier) {
242 for (JavaKind kind : unsafeJavaKinds) {
243 Class<?> javaClass = kind == JavaKind.Object ? Object.class : kind.toJavaClass();
244 String kindName = (kind == JavaKind.Object && !java11OrEarlier) ? "Reference" : kind.name();
245 r.register4("getAndSet" + kindName, Receiver.class, Object.class, long.class, javaClass, new UnsafeAccessPlugin(kind, explicitUnsafeNullChecks) {
246 @Override
|
195 Registration r;
196 r = new Registration(plugins, String.class, replacementsBytecodeProvider);
197 r.setAllowOverwrite(true);
198 if (arch.getFeatures().contains(CPUFeature.SSE4_2)) {
199 r.registerMethodSubstitution(AMD64StringSubstitutions.class, "indexOf", char[].class, int.class,
200 int.class, char[].class, int.class, int.class, int.class);
201 }
202 if (arch.getFeatures().contains(CPUFeature.SSSE3)) {
203 r.registerMethodSubstitution(AMD64StringSubstitutions.class, "indexOf", Receiver.class, int.class, int.class);
204 }
205 r.registerMethodSubstitution(AMD64StringSubstitutions.class, "compareTo", Receiver.class, String.class);
206 }
207 }
208
209 private static void registerStringLatin1Plugins(InvocationPlugins plugins, AMD64 arch, BytecodeProvider replacementsBytecodeProvider) {
210 if (JAVA_SPECIFICATION_VERSION >= 9) {
211 Registration r = new Registration(plugins, "java.lang.StringLatin1", replacementsBytecodeProvider);
212 r.setAllowOverwrite(true);
213 r.registerMethodSubstitution(AMD64StringLatin1Substitutions.class, "compareTo", byte[].class, byte[].class);
214 r.registerMethodSubstitution(AMD64StringLatin1Substitutions.class, "compareToUTF16", byte[].class, byte[].class);
215 r.registerMethodSubstitution(AMD64StringLatin1Substitutions.class, "inflate", byte[].class, int.class, char[].class, int.class, int.class);
216 r.registerMethodSubstitution(AMD64StringLatin1Substitutions.class, "inflate", byte[].class, int.class, byte[].class, int.class, int.class);
217
218 if (arch.getFeatures().contains(CPUFeature.SSSE3)) {
219 r.registerMethodSubstitution(AMD64StringLatin1Substitutions.class, "indexOf", byte[].class, int.class, int.class);
220 }
221 }
222 }
223
224 private static void registerStringUTF16Plugins(InvocationPlugins plugins, AMD64 arch, BytecodeProvider replacementsBytecodeProvider) {
225 if (JAVA_SPECIFICATION_VERSION >= 9) {
226 Registration r = new Registration(plugins, "java.lang.StringUTF16", replacementsBytecodeProvider);
227 r.setAllowOverwrite(true);
228 r.registerMethodSubstitution(AMD64StringUTF16Substitutions.class, "compareTo", byte[].class, byte[].class);
229 r.registerMethodSubstitution(AMD64StringUTF16Substitutions.class, "compareToLatin1", byte[].class, byte[].class);
230 r.registerMethodSubstitution(AMD64StringUTF16Substitutions.class, "compress", char[].class, int.class, byte[].class, int.class, int.class);
231 r.registerMethodSubstitution(AMD64StringUTF16Substitutions.class, "compress", byte[].class, int.class, byte[].class, int.class, int.class);
232
233 if (arch.getFeatures().contains(CPUFeature.SSSE3)) {
234 r.registerMethodSubstitution(AMD64StringUTF16Substitutions.class, "indexOfCharUnsafe", byte[].class, int.class, int.class, int.class);
235 }
236 }
237 }
238
239 private static void registerUnsafePlugins(InvocationPlugins plugins, BytecodeProvider replacementsBytecodeProvider, boolean explicitUnsafeNullChecks) {
240 registerUnsafePlugins(new Registration(plugins, Unsafe.class), explicitUnsafeNullChecks, new JavaKind[]{JavaKind.Int, JavaKind.Long, JavaKind.Object}, true);
241 if (!Java8OrEarlier) {
242 registerUnsafePlugins(new Registration(plugins, "jdk.internal.misc.Unsafe", replacementsBytecodeProvider), explicitUnsafeNullChecks,
243 new JavaKind[]{JavaKind.Boolean, JavaKind.Byte, JavaKind.Char, JavaKind.Short, JavaKind.Int, JavaKind.Long, JavaKind.Object}, Java11OrEarlier);
244 }
245 }
246
247 private static void registerUnsafePlugins(Registration r, boolean explicitUnsafeNullChecks, JavaKind[] unsafeJavaKinds, boolean java11OrEarlier) {
248 for (JavaKind kind : unsafeJavaKinds) {
249 Class<?> javaClass = kind == JavaKind.Object ? Object.class : kind.toJavaClass();
250 String kindName = (kind == JavaKind.Object && !java11OrEarlier) ? "Reference" : kind.name();
251 r.register4("getAndSet" + kindName, Receiver.class, Object.class, long.class, javaClass, new UnsafeAccessPlugin(kind, explicitUnsafeNullChecks) {
252 @Override
|