From 0a0c4e9cb806ea19882b45798af903d6893e72bd Mon Sep 17 00:00:00 2001 From: Hiroshi Yamauchi Date: Wed, 28 Aug 2013 14:32:38 -0700 Subject: A char array copy optimization (dalvik). Bug: 7103825 (cherry picked from commit dc6cb9c7cb4ef636aa6f542615410b56a67b94dc) Change-Id: I0b8ab789ffb8702bc134b32398c120cc3ed29b9c --- vm/native/java_lang_System.cpp | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'vm/native/java_lang_System.cpp') 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 @@ -364,6 +364,41 @@ static void Dalvik_java_lang_System_arraycopy(const u4* args, JValue* pResult) RETURN_VOID(); } +/* + * 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) * @@ -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 }, -- cgit v1.2.3