summaryrefslogtreecommitdiffstats
path: root/vm/reflect
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2012-05-02 17:06:58 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2012-05-02 17:06:58 -0700
commita1b6477b6ad6a78ede584d0638d0df3dac925ef3 (patch)
tree577837d3544d29d9f2a522138539c24c7512029a /vm/reflect
parent627d8d06b366c4aa54bee43daee0d0011638b608 (diff)
parenta14639df65cc0aefafcddda5aae8b591204e45f9 (diff)
downloadandroid_dalvik-a1b6477b6ad6a78ede584d0638d0df3dac925ef3.tar.gz
android_dalvik-a1b6477b6ad6a78ede584d0638d0df3dac925ef3.tar.bz2
android_dalvik-a1b6477b6ad6a78ede584d0638d0df3dac925ef3.zip
am a14639df: Merge "Support architectures that require correctly aligned doubles"
* commit 'a14639df65cc0aefafcddda5aae8b591204e45f9': Support architectures that require correctly aligned doubles
Diffstat (limited to 'vm/reflect')
-rw-r--r--vm/reflect/Reflect.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/vm/reflect/Reflect.cpp b/vm/reflect/Reflect.cpp
index c5d7fbee6..1d055c13d 100644
--- a/vm/reflect/Reflect.cpp
+++ b/vm/reflect/Reflect.cpp
@@ -901,6 +901,9 @@ int dvmConvertPrimitiveValue(PrimitiveType srcType,
};
enum Conversion conv;
+#ifdef ARCH_HAVE_ALIGNED_DOUBLES
+ double ret;
+#endif
assert((srcType != PRIM_VOID) && (srcType != PRIM_NOT));
assert((dstType != PRIM_VOID) && (dstType != PRIM_NOT));
@@ -978,9 +981,15 @@ int dvmConvertPrimitiveValue(PrimitiveType srcType,
case OK4: *dstPtr = *srcPtr; return 1;
case OK8: *(s8*) dstPtr = *(s8*)srcPtr; return 2;
case ItoJ: *(s8*) dstPtr = (s8) (*(s4*) srcPtr); return 2;
+#ifndef ARCH_HAVE_ALIGNED_DOUBLES
case ItoD: *(double*) dstPtr = (double) (*(s4*) srcPtr); return 2;
case JtoD: *(double*) dstPtr = (double) (*(long long*) srcPtr); return 2;
case FtoD: *(double*) dstPtr = (double) (*(float*) srcPtr); return 2;
+#else
+ case ItoD: ret = (double) (*(s4*) srcPtr); memcpy(dstPtr, &ret, 8); return 2;
+ case JtoD: ret = (double) (*(long long*) srcPtr); memcpy(dstPtr, &ret, 8); return 2;
+ case FtoD: ret = (double) (*(float*) srcPtr); memcpy(dstPtr, &ret, 8); return 2;
+#endif
case ItoF: *(float*) dstPtr = (float) (*(int*) srcPtr); return 1;
case JtoF: *(float*) dstPtr = (float) (*(long long*) srcPtr); return 1;
case bad: {