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