Mercurial > pub > dyncall > dyncall
comparison 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 |
comparison
equal
deleted
inserted
replaced
109:9e677d4c0b6b | 110:9aa75a74614c |
---|---|
40 DCuint dcbArgUInt(DCArgs* p) { return (DCuint)dcbArgInt(p); } | 40 DCuint dcbArgUInt(DCArgs* p) { return (DCuint)dcbArgInt(p); } |
41 | 41 |
42 DCulonglong dcbArgULongLong(DCArgs* p) | 42 DCulonglong dcbArgULongLong(DCArgs* p) |
43 { | 43 { |
44 DCulonglong value; | 44 DCulonglong value; |
45 p->reg_count.i += (p->reg_count.i & 1); // Skip one reg if not aligned. | 45 p->reg_count.i += (p->reg_count.i & 1); /* Skip one reg if not aligned. */ |
46 p->stackptr += ((DCulong)p->stackptr & 4) & -4; /* 64bit values are also always aligned on stack */ | |
46 #if defined(DC__Endian_LITTLE) | 47 #if defined(DC__Endian_LITTLE) |
48 value = dcbArgUInt(p); | |
49 value |= ((DCulonglong)dcbArgUInt(p)) << 32; | |
50 #else | |
47 value = ((DCulonglong)dcbArgUInt(p)) << 32; | 51 value = ((DCulonglong)dcbArgUInt(p)) << 32; |
48 value |= dcbArgUInt(p); | 52 value |= dcbArgUInt(p); |
49 #else | |
50 value = dcbArgUInt(p); | |
51 value |= ((DCulonglong)dcbArgUInt(p)) << 32; | |
52 #endif | 53 #endif |
53 return value; | 54 return value; |
54 } | 55 } |
55 DClonglong dcbArgLongLong(DCArgs* p) { return (DClonglong)dcbArgULongLong(p); } | 56 DClonglong dcbArgLongLong(DCArgs* p) { return (DClonglong)dcbArgULongLong(p); } |
56 | 57 |
65 | 66 |
66 DCfloat dcbArgFloat(DCArgs* p) | 67 DCfloat dcbArgFloat(DCArgs* p) |
67 { | 68 { |
68 DCfloat result; | 69 DCfloat result; |
69 if(p->reg_count.f < DCARGS_MIPS_NUM_FREGS) | 70 if(p->reg_count.f < DCARGS_MIPS_NUM_FREGS) |
70 result = (DCfloat)p->freg_data[p->reg_count.f++]; | 71 result = p->freg_data[p->reg_count.f++]; |
71 else { | 72 else { |
72 result = *((DCfloat*)p->stackptr); | 73 result = *((DCfloat*)p->stackptr); |
73 p->stackptr += sizeof(DCfloat); | 74 p->stackptr += sizeof(DCfloat); |
74 } | 75 } |
75 return result; | 76 return result; |
76 } | 77 } |
77 DCdouble dcbArgDouble(DCArgs* p) | 78 DCdouble dcbArgDouble(DCArgs* p) |
78 { | 79 { |
79 union { | 80 union { |
80 DCdouble result; | 81 DCdouble result; |
81 DCfloat f[2]; | 82 DCulonglong i; |
82 } d; | 83 } d; |
83 p->reg_count.f += (p->reg_count.f & 1); // Skip one reg if not aligned. | 84 d.i = dcbArgULongLong(p); /* those are passed via int regs */ |
84 #if defined(DC__Endian_LITTLE) | |
85 d.f[0] = dcbArgFloat(p); | |
86 d.f[1] = dcbArgFloat(p); | |
87 #else | |
88 d.f[1] = dcbArgFloat(p); | |
89 d.f[0] = dcbArgFloat(p); | |
90 #endif | |
91 return d.result; | 85 return d.result; |
92 } | 86 } |
93 | 87 |