Mercurial > pub > dyncall > dyncall
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; }