OSDN Git Service

Support architectures that require correctly aligned doubles
authorRaghu Gandham <raghu@mips.com>
Tue, 31 Jan 2012 02:25:05 +0000 (18:25 -0800)
committerRaghu Gandham <raghu@mips.com>
Tue, 14 Feb 2012 17:52:53 +0000 (09:52 -0800)
CTS: tests.api.java.lang.reflect.MethodTest#test_invokeLjava_lang_Object$Ljava_lang_Object

Change-Id: I93c391884d802b8e69fe3e1ced55a2f2c7866d16
Signed-off-by: Nikola Kuzmanovic <nikola.kuzmanovic@rt-rk.com>
Signed-off-by: Chris Dearman <chris@mips.com>
vm/reflect/Reflect.cpp

index 8caddfc..c3d59e7 100644 (file)
@@ -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: {