comparison 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
comparison
equal deleted inserted replaced
653:0c8838766866 654:0079a8fa894e
33 } DCFPU_t; 33 } DCFPU_t;
34 34
35 struct DCArgs 35 struct DCArgs
36 { 36 {
37 /* buffers and stack-pointer: */ 37 /* buffers and stack-pointer: */
38
39 uint64_t I[8]; 38 uint64_t I[8];
40 DCFPU_t F[8]; 39 DCFPU_t F[8];
41 uint8_t* sp; 40 uint8_t* sp;
42 41
43 /* counters: */ 42 /* counters: */
44 int i; 43 int i;
45 int f; 44 int f;
46 int s;
47 int reserved;
48 }; 45 };
49 46
50 static inline uint8_t* align(uint8_t* p, size_t v) 47 static inline uint8_t* align(uint8_t* p, size_t v)
51 { 48 {
52 return (uint8_t*) ( ( ( (ptrdiff_t) p ) + v - 1) & (ptrdiff_t) -v ); 49 return (uint8_t*) ( ( ( (ptrdiff_t) p ) + v - 1) & (ptrdiff_t) -v );
53 } 50 }
54 51
55 52
56 DClonglong dcbArgLongLong (DCArgs* p) 53 DClonglong dcbArgLongLong(DCArgs* p)
57 { 54 {
58 if (p->i < 8) { 55 if (p->i < 8) {
59 return p->I[p->i++]; 56 return p->I[p->i++];
60 } else { 57 } else {
61 DClonglong value; 58 DClonglong value;
63 value = * ( (DClonglong*) p->sp ); 60 value = * ( (DClonglong*) p->sp );
64 p->sp += sizeof(DClonglong); 61 p->sp += sizeof(DClonglong);
65 return value; 62 return value;
66 } 63 }
67 } 64 }
68 DCdouble dcbArgDouble (DCArgs* p) { 65
69 if (p->f < 8) { 66 DCdouble dcbArgDouble(DCArgs* p)
67 {
68 if (p->f < 8) {
70 return p->F[p->f++].d.value; 69 return p->F[p->f++].d.value;
71 } else { 70 } else {
72 DCdouble value; 71 DCdouble value;
73 p->sp = align(p->sp,sizeof(DCdouble)); 72 p->sp = align(p->sp,sizeof(DCdouble));
74 value = * ( (DCdouble*) p->sp ); 73 value = * ( (DCdouble*) p->sp );
75 p->sp += sizeof(DCdouble); 74 p->sp += sizeof(DCdouble);
76 return value; 75 return value;
77 } 76 }
78 } 77 }
79 DCfloat dcbArgFloat (DCArgs* p) { 78
79 DCfloat dcbArgFloat(DCArgs* p)
80 {
80 if (p->f < 8) { 81 if (p->f < 8) {
81 return p->F[p->f++].f.value; 82 return p->F[p->f++].f.value;
82 } else { 83 } else {
83 DCfloat value; 84 DCfloat value;
84 p->sp = align(p->sp,sizeof(DCfloat)); 85 p->sp = align(p->sp,sizeof(DCfloat));
86 p->sp += sizeof(DCfloat); 87 p->sp += sizeof(DCfloat);
87 return value; 88 return value;
88 } 89 }
89 } 90 }
90 91
91 DClong dcbArgLong (DCArgs* p) { 92 DClong dcbArgLong(DCArgs* p)
93 {
92 if (p->i < 8) { 94 if (p->i < 8) {
93 return (DClong) p->I[p->i++]; 95 return (DClong) p->I[p->i++];
94 } else { 96 } else {
95 DClong value; 97 DClong value;
96 p->sp = align(p->sp,sizeof(DClong)); 98 p->sp = align(p->sp,sizeof(DClong));
98 p->sp += sizeof(DClong); 100 p->sp += sizeof(DClong);
99 return value; 101 return value;
100 } 102 }
101 } 103 }
102 104
103 DCint dcbArgInt (DCArgs* p) { 105 DCint dcbArgInt(DCArgs* p)
106 {
104 if (p->i < 8) { 107 if (p->i < 8) {
105 return (DCint) p->I[p->i++]; 108 return (DCint) p->I[p->i++];
106 } else { 109 } else {
107 DCint value; 110 DCint value;
108 p->sp = align(p->sp,sizeof(DCint)); 111 p->sp = align(p->sp,sizeof(DCint));
110 p->sp += sizeof(DCint); 113 p->sp += sizeof(DCint);
111 return value; 114 return value;
112 } 115 }
113 } 116 }
114 117
115 DCshort dcbArgShort (DCArgs* p) { 118 DCshort dcbArgShort(DCArgs* p)
119 {
116 if (p->i < 8) { 120 if (p->i < 8) {
117 return (DCshort) p->I[p->i++]; 121 return (DCshort) p->I[p->i++];
118 } else { 122 } else {
119 DCshort value; 123 DCshort value;
120 p->sp = align(p->sp,sizeof(DCshort)); 124 p->sp = align(p->sp,sizeof(DCshort));
122 p->sp += sizeof(DCshort); 126 p->sp += sizeof(DCshort);
123 return value; 127 return value;
124 } 128 }
125 } 129 }
126 130
127 DCchar dcbArgChar (DCArgs* p) { 131 DCchar dcbArgChar(DCArgs* p)
132 {
128 if (p->i < 8) { 133 if (p->i < 8) {
129 return (DCchar) p->I[p->i++]; 134 return (DCchar) p->I[p->i++];
130 } else { 135 } else {
131 DCchar value; 136 DCchar value;
132 p->sp = align(p->sp,sizeof(DCchar)); 137 p->sp = align(p->sp,sizeof(DCchar));
134 p->sp += sizeof(DCchar); 139 p->sp += sizeof(DCchar);
135 return value; 140 return value;
136 } 141 }
137 } 142 }
138 143
139 DCbool dcbArgBool (DCArgs* p) { 144 DCbool dcbArgBool(DCArgs* p)
145 {
140 if (p->i < 8) { 146 if (p->i < 8) {
141 return (DCbool) p->I[p->i++]; 147 return (DCbool) p->I[p->i++];
142 } else { 148 } else {
143 DCbool value; 149 DCbool value;
144 p->sp = align(p->sp,sizeof(DCbool)); 150 p->sp = align(p->sp,sizeof(DCbool));
146 p->sp += sizeof(DCbool); 152 p->sp += sizeof(DCbool);
147 return value; 153 return value;
148 } 154 }
149 } 155 }
150 156
151 DCpointer dcbArgPointer(DCArgs* p) { 157 DCpointer dcbArgPointer(DCArgs* p) {
152 return (DCpointer) dcbArgLongLong(p); 158 return (DCpointer) dcbArgLongLong(p);
153 } 159 }
154 160
155 DCuint dcbArgUInt (DCArgs* p) { return (DCuint) dcbArgInt(p); } 161 DCuint dcbArgUInt (DCArgs* p) { return (DCuint) dcbArgInt(p); }
156 DCuchar dcbArgUChar (DCArgs* p) { return (DCuchar) dcbArgChar(p); } 162 DCuchar dcbArgUChar (DCArgs* p) { return (DCuchar) dcbArgChar(p); }
157 DCushort dcbArgUShort (DCArgs* p) { return (DCushort) dcbArgShort(p); } 163 DCushort dcbArgUShort (DCArgs* p) { return (DCushort) dcbArgShort(p); }