comparison dyncallback/dyncall_args_arm32_arm.c @ 38:fb416abb2059

- armhf callback support (not all working, yet)
author cslag
date Fri, 18 Dec 2015 19:07:17 +0100
parents 3e629dc19168
children f01895437921
comparison
equal deleted inserted replaced
37:020ef1972d31 38:fb416abb2059
56 return &args->reg_data[args->reg_count++]; 56 return &args->reg_data[args->reg_count++];
57 else 57 else
58 return (void*)args->stack_ptr++; 58 return (void*)args->stack_ptr++;
59 } 59 }
60 60
61 static DCfloat arm_float(DCArgs* args)
62 {
63 #if defined(DC__ABI_ARM_HF)
64 DCfloat f;
65 if(args->freg_count < 16) {
66 f = args->f[args->freg_count++];
67
68 /* if freg_count was odd, sync with dreg_count */
69 if(!(args->freg_count & 1) && (args->freg_count < args->dreg_count))
70 args->freg_count = args->dreg_count;
71
72 return f;
73 }
74 #endif
75 return *(DCfloat*)arm_word(args);
76 }
61 77
62 static DCdouble arm_double(DCArgs* args) 78 static DCdouble arm_double(DCArgs* args)
63 { 79 {
64 union { 80 union {
65 DCdouble d; 81 DCdouble d;
66 DClong l[2]; 82 DClong l[2];
67 } d; 83 } d;
84 #if defined(DC__ABI_ARM_HF)
85 if(args->dreg_count < args->freg_count)
86 args->dreg_count = (args->freg_count+1)&0x1e; /* clear last bit, counter won't be higher than 16, anyways */
87
88 if(args->dreg_count < 16) {
89 d.d = *(DCdouble*)&args->f[args->dreg_count];
90 args->dreg_count += 2;
91
92 /* freg_count is either odd (pointing to a gap), or always the same as dreg_count */
93 if(!(args->freg_count & 1))
94 args->freg_count = args->dreg_count;
95 return d.d;
96 }
97 #endif
68 arm_align_64(args); 98 arm_align_64(args);
69 d.l[0] = *(DClong*)arm_word(args); 99 d.l[0] = *(DClong*)arm_word(args);
70 d.l[1] = *(DClong*)arm_word(args); 100 d.l[1] = *(DClong*)arm_word(args);
71 return d.d; 101 return d.d;
72 } 102 }
73
74 103
75 static DClonglong arm_longlong(DCArgs* args) 104 static DClonglong arm_longlong(DCArgs* args)
76 { 105 {
77 union { 106 union {
78 DClonglong ll; 107 DClonglong ll;
107 136
108 137
109 DCpointer dcbArgPointer (DCArgs* p) { return (DCpointer) dcbArgLong(p); } 138 DCpointer dcbArgPointer (DCArgs* p) { return (DCpointer) dcbArgLong(p); }
110 139
111 DCdouble dcbArgDouble (DCArgs* p) { return arm_double(p); } 140 DCdouble dcbArgDouble (DCArgs* p) { return arm_double(p); }
112 DCfloat dcbArgFloat (DCArgs* p) { return *(DCfloat*) arm_word(p); } 141 DCfloat dcbArgFloat (DCArgs* p) { return arm_float(p); }
113 142