diff options
author | Hiroshi Yamauchi <yamauchi@google.com> | 2013-08-28 14:32:38 -0700 |
---|---|---|
committer | Steve Kondik <shade@chemlab.org> | 2014-01-17 00:19:50 -0800 |
commit | bc4a6ac49f0aee1e20797388e2ec4f3fd1a0c518 (patch) | |
tree | b7b916c165622648cbe09e86a8845eb6de9e9c21 | |
parent | ea94fa6cd02cb82899f59a4726926de29f322820 (diff) | |
download | android_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.cpp | 37 |
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 }, |