diff dyncallback/dyncall_args_mips.c @ 102:b7a9b524f0c3

- mips o32 callbacks, first draft (calls into handler correctly, with correct params, but doesn't return)
author cslag
date Tue, 07 Jun 2016 09:05:34 +0200
parents 3e629dc19168
children 9e677d4c0b6b
line wrap: on
line diff
--- a/dyncallback/dyncall_args_mips.c	Tue Jun 07 07:34:37 2016 +0200
+++ b/dyncallback/dyncall_args_mips.c	Tue Jun 07 09:05:34 2016 +0200
@@ -26,11 +26,11 @@
 
 #include "dyncall_args_mips.h"
 
-DCint dcbArgInt(DCArgs* p) 
+DCint dcbArgInt(DCArgs* p)
 {
   DCint value;
-  if(p->ireg_count < 8)
-    value = p->ireg_data[p->ireg_count++];
+  if(p->reg_count.i < DCARGS_MIPS_PARAM_REGS)
+    value = p->reg_data.i[p->reg_count.i++];
   else {
     value = *((int*)p->stackptr);
     p->stackptr += sizeof(int);
@@ -39,12 +39,17 @@
 }
 DCuint dcbArgUInt(DCArgs* p) { return (DCuint)dcbArgInt(p); }
 
-DCulonglong dcbArgULongLong(DCArgs* p) 
+DCulonglong dcbArgULongLong(DCArgs* p)
 {
   DCulonglong value;
-  p->ireg_count += (p->ireg_count & 1); // Skip one reg if not aligned.
+  p->reg_count.i += (p->reg_count.i & 1); // Skip one reg if not aligned.
+#if defined(DC__Endian_LITTLE)
   value  = ((DCulonglong)dcbArgUInt(p)) << 32;
   value |= dcbArgUInt(p);
+#else
+  value  = dcbArgUInt(p);
+  value |= ((DCulonglong)dcbArgUInt(p)) << 32;
+#endif
   return value;
 }
 DClonglong dcbArgLongLong(DCArgs* p) { return (DClonglong)dcbArgULongLong(p); }
@@ -59,24 +64,30 @@
 DCpointer   dcbArgPointer(DCArgs* p) { return (DCpointer)dcbArgUInt(p); }
 
 DCfloat dcbArgFloat(DCArgs* p)
-{ 
+{
   DCfloat result;
-  if(p->freg_count < 8)
-    result = (DCfloat)p->freg_data[p->freg_count++];
+  if(p->reg_count.f < DCARGS_MIPS_PARAM_REGS)
+    result = (DCfloat)p->reg_data.f[p->reg_count.f++];
   else {
     result = *((float*)p->stackptr);
     p->stackptr += sizeof(float);
   }
-  return result; 
+  return result;
 }
-DCdouble dcbArgDouble(DCArgs* p) 
-{ 
+DCdouble dcbArgDouble(DCArgs* p)
+{
   union {
     DCdouble result;
     DCfloat f[2];
   } d;
-  p->freg_count += (p->freg_count & 1); // Skip one reg if not aligned.
+  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
   return d.result;
 }
+