Mercurial > pub > dyncall > dyncall
diff dyncallback/dyncall_args_sparc64.c @ 196:95cf20c0d1de
- sparc64 callbacks:
* floating point support
* fixes for many arg calls
* this completes sparc64 callback support
author | Tassilo Philipp |
---|---|
date | Sun, 19 Mar 2017 19:34:34 +0100 |
parents | 2f7a7f3472cb |
children | f5577f6bf97a |
line wrap: on
line diff
--- a/dyncallback/dyncall_args_sparc64.c Sat Mar 18 19:10:01 2017 +0100 +++ b/dyncallback/dyncall_args_sparc64.c Sun Mar 19 19:34:34 2017 +0100 @@ -26,7 +26,7 @@ #include "dyncall_args_sparc64.h" -DCulonglong dcbArgULongLong(DCArgs* p) { return *(DCulonglong*) p->arg_ptr++; } +DCulonglong dcbArgULongLong(DCArgs* p) { return p->arg_ptr[p->i++]; } DClonglong dcbArgLongLong (DCArgs* p) { return (DClonglong)dcbArgULongLong(p); } DCulong dcbArgULong (DCArgs* p) { return (DCulong) dcbArgULongLong(p); } DClong dcbArgLong (DCArgs* p) { return (DClong) dcbArgULongLong(p); } @@ -38,6 +38,18 @@ DCshort dcbArgShort (DCArgs* p) { return (DCshort) dcbArgULongLong(p); } DCbool dcbArgBool (DCArgs* p) { return (DCbool) dcbArgULongLong(p); } DCpointer dcbArgPointer (DCArgs* p) { return (DCpointer) dcbArgULongLong(p); } -DCdouble dcbArgDouble (DCArgs* p) { return *(DCdouble*) p->arg_ptr++; } -DCfloat dcbArgFloat (DCArgs* p) { return *(DCfloat*) p->arg_ptr++; } + +DCdouble dcbArgDouble(DCArgs* p) +{ + return (p->i < DCARGS_SPARC64_NUM_DOUBLE_REGS) + ? p->dreg_data[p->i++] + : *(DCdouble*)(p->arg_ptr + p->i++); +} +DCfloat dcbArgFloat(DCArgs* p) +{ + return (p->i < DCARGS_SPARC64_NUM_DOUBLE_REGS) + ? *((DCfloat*)(p->dreg_data + p->i++)+1) /* +1 bc single-prec fp args are */ + : *((DCfloat*)(p->arg_ptr + p->i++)+1); /* right aligned in 64bit slot */ +} +