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