Mercurial > pub > dyncall > dyncall
diff dyncall/dyncall_callvm_mips_o32.c @ 302:d55f9d508074
- mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
- cleanup of some mips files, removed unnecessary file, renamings..
- doc/manual cleanups, changelog entry
author | Tassilo Philipp |
---|---|
date | Mon, 21 May 2018 02:48:12 +0200 |
parents | f5577f6bf97a |
children | b104c5beec8b |
line wrap: on
line diff
--- a/dyncall/dyncall_callvm_mips_o32.c Sun May 20 02:23:44 2018 +0200 +++ b/dyncall/dyncall_callvm_mips_o32.c Mon May 21 02:48:12 2018 +0200 @@ -77,7 +77,7 @@ static void dc_callvm_argPointer_mips_o32(DCCallVM* in_self, DCpointer x) { - dc_callvm_argInt_mips_o32(in_self, * (DCint*) &x ); + dc_callvm_argInt_mips_o32(in_self, *(DCint*)&x); } static void dc_callvm_argBool_mips_o32(DCCallVM* in_self, DCbool x) @@ -100,51 +100,55 @@ dc_callvm_argInt_mips_o32(in_self, (DCint)x); } -static void dc_callvm_argLongLong_mips_o32(DCCallVM* in_self, DClonglong Lv) +static void dc_callvm_argLongLong_mips_o32(DCCallVM* in_self, DClonglong x) { DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self; - + /* 64-bit values need to be aligned on 8 byte boundaries */ dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4); - dcVecAppend(&self->mVecHead, &Lv, sizeof(DClonglong)); - self->mArgCount += 1; + dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong)); + self->mArgCount++; } static void dc_callvm_argFloat_mips_o32(DCCallVM* in_self, DCfloat x) { DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self; - dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat) ); + dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat)); + +#if defined(DC__ABI_HARDFLOAT) if (self->mArgCount < 2) { -#if defined(DC__Endian_LITTLE) +# if defined(DC__Endian_LITTLE) self->mRegData.u[self->mArgCount].f[0] = x; -#else +# else self->mRegData.u[self->mArgCount].f[1] = x; -#endif -#if 0 +# endif +# if 0 self->mRegData.u[self->mArgCount].f[1] = x; call kernel - mips: - lwc1 $f12, 4($5) <--- byte offset 4 - lwc1 $f13, 0($5) - lwc1 $f14, 12($5) <--- byte offset 12 - lwc1 $f15, 8($5) - mipsel: - lwc1 $f12, 0($5) <--- byte offset 4 - lwc1 $f13, 4($5) - lwc1 $f14, 8($5) <--- byte offset 12 - lwc1 $f15, 12($5) + mips: + lwc1 $f12, 4($5) <--- byte offset 4 + lwc1 $f13, 0($5) + lwc1 $f14, 12($5) <--- byte offset 12 + lwc1 $f15, 8($5) + mipsel: + lwc1 $f12, 0($5) <--- byte offset 4 + lwc1 $f13, 4($5) + lwc1 $f14, 8($5) <--- byte offset 12 + lwc1 $f15, 12($5) -#if defined(DC__Endian_LITTLE) +# if defined(DC__Endian_LITTLE) /* index 0 and 2 */ self->mRegData.floats[self->mArgCount*2] = x; -#else +# else /* index 1 and 3 */ self->mRegData.floats[self->mArgCount*2+1] = x; -#endif -#endif +# endif +# endif } +#endif /* DC__ABI_HARDFLOAT */ + self->mArgCount++; } @@ -153,9 +157,13 @@ DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self; /* 64-bit values need to be aligned on 8 byte boundaries */ dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4); - dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble) ); + dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble)); + +#if defined(DC__ABI_HARDFLOAT) if (self->mArgCount < 2) self->mRegData.u[self->mArgCount].d = x; +#endif /* DC__ABI_HARDFLOAT */ + self->mArgCount++; }