Mercurial > pub > dyncall > dyncall
annotate dyncallback/dyncall_args_arm64_apple.c @ 654:0079a8fa894e
- arm64 tweaks/cleanups for callbacks:
* using 32b less of stack space
* saved one instruction
* simplified
* cosmetics
author | Tassilo Philipp |
---|---|
date | Thu, 07 Mar 2024 18:01:54 +0100 |
parents | 2562c89d5bb5 |
children |
rev | line source |
---|---|
0 | 1 /* |
2 | |
3 Package: dyncall | |
4 Library: dyncallback | |
5 File: dyncallback/dyncall_args_arm64_apple.c | |
6 Description: Callback's Arguments VM - Implementation for Apple's ARM64 / ARMv8 / AAPCS64 | |
7 License: | |
8 | |
544
111236b31c75
- C++ non-trivial aggregate-by-value handling:
Tassilo Philipp
parents:
533
diff
changeset
|
9 Copyright (c) 2015-2022 Daniel Adler <dadler@uni-goettingen.de>, |
281 | 10 Tassilo Philipp <tphilipp@potion-studios.com> |
0 | 11 |
12 Permission to use, copy, modify, and distribute this software for any | |
13 purpose with or without fee is hereby granted, provided that the above | |
14 copyright notice and this permission notice appear in all copies. | |
15 | |
16 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
17 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
18 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
19 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
22 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
23 | |
24 */ | |
25 | |
26 #include "dyncall_args.h" | |
27 | |
28 #include <stdint.h> | |
29 | |
30 typedef union { | |
31 struct { double value; } d; | |
32 struct { float value; } f; | |
33 } DCFPU_t; | |
34 | |
35 struct DCArgs | |
36 { | |
37 /* buffers and stack-pointer: */ | |
38 uint64_t I[8]; | |
39 DCFPU_t F[8]; | |
40 uint8_t* sp; | |
654 | 41 |
0 | 42 /* counters: */ |
43 int i; | |
44 int f; | |
45 }; | |
46 | |
47 static inline uint8_t* align(uint8_t* p, size_t v) | |
48 { | |
49 return (uint8_t*) ( ( ( (ptrdiff_t) p ) + v - 1) & (ptrdiff_t) -v ); | |
50 } | |
51 | |
52 | |
654 | 53 DClonglong dcbArgLongLong(DCArgs* p) |
0 | 54 { |
55 if (p->i < 8) { | |
56 return p->I[p->i++]; | |
57 } else { | |
58 DClonglong value; | |
59 p->sp = align(p->sp,sizeof(DClonglong)); | |
60 value = * ( (DClonglong*) p->sp ); | |
61 p->sp += sizeof(DClonglong); | |
62 return value; | |
63 } | |
64 } | |
654 | 65 |
66 DCdouble dcbArgDouble(DCArgs* p) | |
67 { | |
68 if (p->f < 8) { | |
0 | 69 return p->F[p->f++].d.value; |
70 } else { | |
71 DCdouble value; | |
72 p->sp = align(p->sp,sizeof(DCdouble)); | |
73 value = * ( (DCdouble*) p->sp ); | |
74 p->sp += sizeof(DCdouble); | |
75 return value; | |
76 } | |
77 } | |
654 | 78 |
79 DCfloat dcbArgFloat(DCArgs* p) | |
80 { | |
0 | 81 if (p->f < 8) { |
82 return p->F[p->f++].f.value; | |
83 } else { | |
84 DCfloat value; | |
85 p->sp = align(p->sp,sizeof(DCfloat)); | |
86 value = * ( (DCfloat*) p->sp ); | |
87 p->sp += sizeof(DCfloat); | |
88 return value; | |
89 } | |
90 } | |
91 | |
654 | 92 DClong dcbArgLong(DCArgs* p) |
93 { | |
0 | 94 if (p->i < 8) { |
95 return (DClong) p->I[p->i++]; | |
96 } else { | |
97 DClong value; | |
98 p->sp = align(p->sp,sizeof(DClong)); | |
99 value = * ( (DClong*) p->sp ); | |
100 p->sp += sizeof(DClong); | |
101 return value; | |
102 } | |
103 } | |
104 | |
654 | 105 DCint dcbArgInt(DCArgs* p) |
106 { | |
0 | 107 if (p->i < 8) { |
108 return (DCint) p->I[p->i++]; | |
109 } else { | |
110 DCint value; | |
111 p->sp = align(p->sp,sizeof(DCint)); | |
112 value = * ( (DCint*) p->sp ); | |
113 p->sp += sizeof(DCint); | |
114 return value; | |
115 } | |
116 } | |
117 | |
654 | 118 DCshort dcbArgShort(DCArgs* p) |
119 { | |
0 | 120 if (p->i < 8) { |
121 return (DCshort) p->I[p->i++]; | |
122 } else { | |
123 DCshort value; | |
124 p->sp = align(p->sp,sizeof(DCshort)); | |
125 value = * ( (DCshort*) p->sp ); | |
126 p->sp += sizeof(DCshort); | |
127 return value; | |
128 } | |
129 } | |
130 | |
654 | 131 DCchar dcbArgChar(DCArgs* p) |
132 { | |
0 | 133 if (p->i < 8) { |
134 return (DCchar) p->I[p->i++]; | |
135 } else { | |
136 DCchar value; | |
137 p->sp = align(p->sp,sizeof(DCchar)); | |
138 value = * ( (DCchar*) p->sp ); | |
139 p->sp += sizeof(DCchar); | |
140 return value; | |
141 } | |
142 } | |
143 | |
654 | 144 DCbool dcbArgBool(DCArgs* p) |
145 { | |
0 | 146 if (p->i < 8) { |
147 return (DCbool) p->I[p->i++]; | |
148 } else { | |
149 DCbool value; | |
150 p->sp = align(p->sp,sizeof(DCbool)); | |
151 value = * ( (DCbool*) p->sp ); | |
152 p->sp += sizeof(DCbool); | |
153 return value; | |
154 } | |
155 } | |
156 | |
654 | 157 DCpointer dcbArgPointer(DCArgs* p) { |
158 return (DCpointer) dcbArgLongLong(p); | |
0 | 159 } |
160 | |
161 DCuint dcbArgUInt (DCArgs* p) { return (DCuint) dcbArgInt(p); } | |
162 DCuchar dcbArgUChar (DCArgs* p) { return (DCuchar) dcbArgChar(p); } | |
163 DCushort dcbArgUShort (DCArgs* p) { return (DCushort) dcbArgShort(p); } | |
164 DCulong dcbArgULong (DCArgs* p) { return (DCulong) dcbArgLong(p); } | |
165 DCulonglong dcbArgULongLong(DCArgs* p) { return (DCulonglong) dcbArgLongLong(p); } | |
166 | |
580
2562c89d5bb5
- added missing return values for dcbArgAggr() on functions w/o aggregate support
Tassilo Philipp
parents:
544
diff
changeset
|
167 DCpointer dcbArgAggr (DCArgs* p, DCpointer target) { /* @@@AGGR not impl */ return NULL; } |
533
71c884e610f0
- integration of patches from Raphael Luba, Thekla, Inc.:
Tassilo Philipp
parents:
281
diff
changeset
|
168 void dcbReturnAggr (DCArgs *args, DCValue *result, DCpointer ret) { /* @@@AGGR not impl */ } |
71c884e610f0
- integration of patches from Raphael Luba, Thekla, Inc.:
Tassilo Philipp
parents:
281
diff
changeset
|
169 |