diff dyncallback/dyncall_args_mips.c @ 110:9aa75a74614c

- working mips32 eabi callbacks - mips32 eabi doc update - switched some mips32 eabi call assembly to use more portable pseudo instructions for storing floats - fixed weird type use of var declaration in mips callbacks - ToDo update - converted some // comments to old c-style - test code build fix for some test suites on some platforms
author cslag
date Sat, 18 Jun 2016 19:38:22 +0200
parents 9e677d4c0b6b
children f5577f6bf97a
line wrap: on
line diff
--- a/dyncallback/dyncall_args_mips.c	Sat Jun 11 21:44:38 2016 +0200
+++ b/dyncallback/dyncall_args_mips.c	Sat Jun 18 19:38:22 2016 +0200
@@ -42,13 +42,14 @@
 DCulonglong dcbArgULongLong(DCArgs* p)
 {
   DCulonglong value;
-  p->reg_count.i += (p->reg_count.i & 1); // Skip one reg if not aligned.
+  p->reg_count.i += (p->reg_count.i & 1);         /* Skip one reg if not aligned. */
+  p->stackptr += ((DCulong)p->stackptr & 4) & -4; /* 64bit values are also always aligned on stack */
 #if defined(DC__Endian_LITTLE)
+  value  = dcbArgUInt(p);
+  value |= ((DCulonglong)dcbArgUInt(p)) << 32;
+#else
   value  = ((DCulonglong)dcbArgUInt(p)) << 32;
   value |= dcbArgUInt(p);
-#else
-  value  = dcbArgUInt(p);
-  value |= ((DCulonglong)dcbArgUInt(p)) << 32;
 #endif
   return value;
 }
@@ -67,7 +68,7 @@
 {
   DCfloat result;
   if(p->reg_count.f < DCARGS_MIPS_NUM_FREGS)
-    result = (DCfloat)p->freg_data[p->reg_count.f++];
+    result = p->freg_data[p->reg_count.f++];
   else {
     result = *((DCfloat*)p->stackptr);
     p->stackptr += sizeof(DCfloat);
@@ -78,16 +79,9 @@
 {
   union {
     DCdouble result;
-    DCfloat  f[2];
+    DCulonglong i;
   } d;
-  p->reg_count.f += (p->reg_count.f & 1); // Skip one reg if not aligned.
-#if defined(DC__Endian_LITTLE)
-  d.f[0] = dcbArgFloat(p);
-  d.f[1] = dcbArgFloat(p);
-#else
-  d.f[1] = dcbArgFloat(p);
-  d.f[0] = dcbArgFloat(p);
-#endif
+  d.i = dcbArgULongLong(p); /* those are passed via int regs */
   return d.result;
 }