Mercurial > pub > dyncall > dyncall
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 |