--- a/hotspot/src/share/vm/opto/library_call.cpp Thu May 29 12:04:14 2008 -0700
+++ b/hotspot/src/share/vm/opto/library_call.cpp Thu May 29 16:22:09 2008 -0700
@@ -163,6 +163,7 @@
bool inline_native_newArray();
bool inline_native_getLength();
bool inline_array_copyOf(bool is_copyOfRange);
+ bool inline_array_equals();
bool inline_native_clone(bool is_virtual);
bool inline_native_Reflection_getCallerClass();
bool inline_native_AtomicLong_get();
@@ -259,6 +260,7 @@
switch (id) {
case vmIntrinsics::_indexOf:
case vmIntrinsics::_compareTo:
+ case vmIntrinsics::_equalsC:
break; // InlineNatives does not control String.compareTo
default:
return NULL;
@@ -272,6 +274,9 @@
case vmIntrinsics::_indexOf:
if (!SpecialStringIndexOf) return NULL;
break;
+ case vmIntrinsics::_equalsC:
+ if (!SpecialArraysEquals) return NULL;
+ break;
case vmIntrinsics::_arraycopy:
if (!InlineArrayCopy) return NULL;
break;
@@ -586,6 +591,8 @@
return inline_array_copyOf(false);
case vmIntrinsics::_copyOfRange:
return inline_array_copyOf(true);
+ case vmIntrinsics::_equalsC:
+ return inline_array_equals();
case vmIntrinsics::_clone:
return inline_native_clone(intrinsic()->is_virtual());
@@ -813,6 +820,22 @@
return true;
}
+//------------------------------inline_array_equals----------------------------
+bool LibraryCallKit::inline_array_equals() {
+
+ _sp += 2;
+ Node *argument2 = pop();
+ Node *argument1 = pop();
+
+ Node* equals =
+ _gvn.transform(new (C, 3) AryEqNode(control(),
+ argument1,
+ argument2)
+ );
+ push(equals);
+ return true;
+}
+
// Java version of String.indexOf(constant string)
// class StringDecl {
// StringDecl(char[] ca) {