summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHiroshi Yamauchi <yamauchi@google.com>2013-08-28 14:32:38 -0700
committerSteve Kondik <shade@chemlab.org>2014-01-17 00:19:50 -0800
commitbc4a6ac49f0aee1e20797388e2ec4f3fd1a0c518 (patch)
treeb7b916c165622648cbe09e86a8845eb6de9e9c21
parentea94fa6cd02cb82899f59a4726926de29f322820 (diff)
downloadandroid_dalvik-bc4a6ac49f0aee1e20797388e2ec4f3fd1a0c518.tar.gz
android_dalvik-bc4a6ac49f0aee1e20797388e2ec4f3fd1a0c518.tar.bz2
android_dalvik-bc4a6ac49f0aee1e20797388e2ec4f3fd1a0c518.zip
A char array copy optimization (dalvik).
Bug: 7103825 (cherry picked from commit dc6cb9c7cb4ef636aa6f542615410b56a67b94dc) Change-Id: I0b8ab789ffb8702bc134b32398c120cc3ed29b9c
-rw-r--r--vm/native/java_lang_System.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/vm/native/java_lang_System.cpp b/vm/native/java_lang_System.cpp
index 4485a9217..33c295554 100644
--- a/vm/native/java_lang_System.cpp
+++ b/vm/native/java_lang_System.cpp
@@ -365,6 +365,41 @@ static void Dalvik_java_lang_System_arraycopy(const u4* args, JValue* pResult)
}
/*
+ * public static void arraycopyCharUnchecked(char[] src, int srcPos, char[] dest,
+ * int destPos, int length)
+ *
+ * This is a char[] specialized, native, unchecked version of
+ * arraycopy(). This assumes error checking has been done.
+ */
+static void Dalvik_java_lang_System_arraycopyCharUnchecked(const u4* args, JValue* pResult)
+{
+ ArrayObject* srcArray = (ArrayObject*) args[0];
+ int srcPos = args[1];
+ ArrayObject* dstArray = (ArrayObject*) args[2];
+ int dstPos = args[3];
+ int length = args[4];
+ assert(srcArray != NULL);
+ assert(dstArray != NULL);
+ assert(dvmIsArray(srcArray));
+ assert(dvmIsArray(dstArray));
+ assert(srcPos >= 0 && dstPos >= 0 && length >= 0 &&
+ srcPos + length <= (int) srcArray->length &&
+ dstPos + length <= (int) dstArray->length);
+#ifndef NDEBUG
+ ClassObject* srcClass = srcArray->clazz;
+ ClassObject* dstClass = dstArray->clazz;
+ char srcType = srcClass->descriptor[1];
+ char dstType = dstClass->descriptor[1];
+ assert(srcType == 'C' && dstType == 'C');
+#endif
+ /* 2 bytes per element */
+ move16((u1*) dstArray->contents + dstPos * 2,
+ (const u1*) srcArray->contents + srcPos * 2,
+ length * 2);
+ RETURN_VOID();
+}
+
+/*
* static int identityHashCode(Object x)
*
* Returns that hash code that the default hashCode()
@@ -381,6 +416,8 @@ static void Dalvik_java_lang_System_identityHashCode(const u4* args,
const DalvikNativeMethod dvm_java_lang_System[] = {
{ "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Dalvik_java_lang_System_arraycopy },
+ { "arraycopyCharUnchecked", "([CI[CII)V",
+ Dalvik_java_lang_System_arraycopyCharUnchecked },
{ "identityHashCode", "(Ljava/lang/Object;)I",
Dalvik_java_lang_System_identityHashCode },
{ NULL, NULL, NULL },