arch/m68k-all/include/gencall.c: Indentation fixes
[AROS.git] / arch / m68k-all / include / gencall.c
blob2559b838d13afdde0e2a27375c79b602bac9ad4f
1 /*
2 Copyright © 1995-2001, The AROS Development Team. All rights reserved.
3 $Id$
4 */
5 /* This program generates the libcall.h macroset for gcc-4.5.1 m68k-elf
7 * WARNING: The header generated by this program is designed
8 * to work with GCC 4.5.1 and GCC 4.6.1 m68k-elf ONLY.
10 * If it breaks, you get to keep both pieces.
13 #include <stdio.h>
15 #define GENCALL_MAX (13 + 1) /* Max number of arguments */
17 /* NOTE: For all 'call' macros, ie AROS_LC5(), the
18 * 'bt' parameter is frequently garbled by
19 * callers who use '#define's like:
21 * #define UtilityBase mydata->utilitybase
23 * this makes a 'bt' parameter of 'struct UtilityBase *'
24 * turn into 'struct mydata->utilitybase *'.
26 * Unhappiness ensues. So, we must use 'void *'
27 * for all 'bt' arguments in the call macros.
30 #define FLAG_BN (1 << 0)
31 #define FLAG_DOUBLE (1 << 1)
33 void aros_ufp(int id, int is_static)
35 int i;
37 printf("#define AROS_UFP%d%s(t,n", id, is_static ? "S" : "");
38 for (i = 0; i < id; i++)
39 printf(",a%d", i + 1);
40 printf(") \\\n");
41 printf("\t%st n (void)\n", is_static ? "static " : "");
44 void aros_ufh(int id, int is_static)
46 int i;
48 printf("#define AROS_UFH%d%s(t,n", id, is_static ? "S" : "");
49 for (i = 0; i < id; i++)
50 printf(",a%d", i + 1);
51 printf(") \\\n");
52 printf("\t%st n (void) {%s\n", is_static ? "static " : "", (i==0) ? "" : " \\");
53 for (i = 0; i < id; i++)
54 printf(" \\\n\t__AROS_UFPA(a%d) __attribute__((unused)) __AROS_UFCA(a%d) = __AROS_ISREG(a%d,__AROS_FP_REG) ? (__AROS_UFPA(a%d))(ULONG)__builtin_frame_address(1) : ({register ULONG __r asm(__AROS_LSA(a%d));(__AROS_UFPA(a%d))__r;});", i+1, i+1, i+1, i+1, i+1, i+1);
55 printf("\n");
58 static void asm_regs_init(int id, int flags, const char *jmp, const char *addr)
60 int i;
61 int has_bn = (flags & FLAG_BN);
62 int ret_d = (flags & FLAG_DOUBLE);
64 /* Input values */
65 for (i = 0; i < id; i++)
66 printf("\t ULONG _arg%d = (ULONG)__AROS_LCA(a%d); \\\n",
67 i + 1, i + 1
69 if (has_bn)
70 printf("\t ULONG _bn_arg = (ULONG)bn; \\\n");
72 /* Define registers */
73 printf("\t register volatile ULONG _ret0 asm(\"%%d0\"); \\\n");
74 if (ret_d)
75 printf("\t register volatile ULONG _ret1 asm(\"%%d1\"); \\\n");
76 for (i = 0; i < id; i++)
77 printf("\t register volatile ULONG __AROS_LTA(a%d) asm(__AROS_LSA(a%d)); \\\n",
78 i + 1, i + 1
80 if (has_bn)
81 printf("\t register volatile ULONG _bn asm(\"%%a6\"); \\\n");
84 /* Set registers (non FP) */
85 for (i = 1; i <= id; i++)
86 printf("\t if (! __AROS_ISREG(a%d,__AROS_FP_REG)) { \\\n"
87 "\t __AROS_LTA(a%d) = _arg%d; } \\\n",
88 i, i, i
90 if (has_bn)
91 printf("\t if (! __AROS_ISREG(bt,bn,A6,__AROS_FP_REG)) { \\\n"
92 "\t _bn = _bn_arg; } \\\n"
95 /* Set FP register */
96 for (i = 1; i <= id; i++)
98 int j;
99 printf("\t if ( __AROS_ISREG(a%d,__AROS_FP_REG)) { \\\n"
100 "\t asm volatile (\"move.l %%%%\" __AROS_FP_SREG \",%%%%sp@-\\nmove.l %%0,%%%%\" __AROS_FP_SREG \"\\n%s\\nmove.l %%%%sp@+,%%%%\" __AROS_FP_SREG \"\\n\" : : \"r\" (_arg%d), %s \\\n",
101 i, jmp, i, addr
103 for (j = 0; j < id; j++)
104 printf("\t\t, \"r\" (__AROS_LTA(a%d)) \\\n", j + 1);
105 printf("\t ); }\\\n");
107 if (has_bn)
109 int j;
110 printf("\t if ( __AROS_ISREG(bt,bn,A6,__AROS_FP_REG)) { \\\n"
111 "\t asm volatile (\"move.l %%%%\" __AROS_FP_SREG \",%%%%sp@-\\nmove.l %%0,%%%%\" __AROS_FP_SREG \"\\n%s\\nmove.l %%%%sp@+,%%%%\" __AROS_FP_SREG \"\\n\" : : \"r\" (_bn_arg), %s \\\n", jmp, addr
113 for (j = 0; j < id; j++)
114 printf("\t\t, \"r\" (__AROS_LTA(a%d)) \\\n", j + 1);
115 printf("\t ); }\\\n");
117 if (has_bn || id > 0)
119 int j;
120 printf("\t if (!(0");
121 if (has_bn)
122 printf(" || __AROS_ISREG(bt,bn,A6,__AROS_FP_REG)");
123 for (i = 0; i < id; i++)
124 printf(" || __AROS_ISREG(a%d,__AROS_FP_REG)", i+1);
125 printf(")) {\\\n"
126 "\t asm volatile (\"%s\\n\" : : \"i\" (0), %s \\\n", jmp, addr
128 for (j = 0; j < id; j++)
129 printf("\t\t, \"r\" (__AROS_LTA(a%d)) \\\n", j + 1);
130 printf("\t ); }\\\n");
134 static void asm_regs_exit(int id, int flags)
136 int ret_d = (flags & FLAG_DOUBLE);
138 /* Get the return code */
139 if (ret_d)
141 printf("\t asm volatile (\"\" : \"=r\" (_ret0), \"=r\" (_ret1) : : \"%%a0\", \"%%a1\", \"cc\", \"memory\"); \\\n");
142 printf("\t (t)({union { struct { ULONG r0,r1; } v; double d; } rv;\\\n");
143 printf("\t rv.v.r0 = _ret0; rv.v.r1 = _ret1; rv.d; });\\\n");
145 else
147 printf("\t asm volatile (\"\" : \"=r\" (_ret0) : : \"%%d1\", \"%%a0\", \"%%a1\", \"cc\", \"memory\"); \\\n");
148 printf("\t (t)_ret0; \\\n");
152 static void aros_ufc(int id)
154 int i;
155 char jmp[256];
157 printf("#define AROS_UFC%d(t,n", id);
158 for (i = 0; i < id; i++)
159 printf(",a%d", i + 1);
160 printf(") \\\n");
161 printf("\t({ APTR _n = (n);\\\n");
162 snprintf(jmp, sizeof(jmp),
163 "pea.l 0f\\n"
164 "move.l %%1, %%%%sp@-\\n"
165 "rts\\n"
166 "0:\\n"
168 jmp[sizeof(jmp)-1]=0;
169 asm_regs_init(i, 0, jmp, "\"r\" (_n), \"i\" (__LINE__)");
171 asm_regs_exit(i, 0);
172 printf("\t })\n\n");
175 void aros_lc(int id, int is_double)
177 int i;
178 int flags = FLAG_BN | (is_double ? FLAG_DOUBLE : 0);
180 printf("#define AROS_LC%d%s(t,n,", id, is_double ? "D" : "");
181 for (i = 0; i < id; i++)
182 printf("a%d,", i + 1);
183 printf("bt,bn,o,s) \\\n");
184 printf("\t({ \\\n");
185 asm_regs_init(id, flags, "jsr %c1(%%a6)", "\"i\" (-1 * (o) * LIB_VECTSIZE), \"r\" (_bn)");
186 asm_regs_exit(id, flags);
187 printf("\t })\n\n");
190 void aros_lp(int id, int is_ignored)
192 int i;
194 printf("#define AROS_LP%d%s(t,n,", id, is_ignored ? "I" : "");
195 for (i = 0; i < id; i++)
196 printf("a%d,", i + 1);
197 printf("bt,bn,o,s) \\\n");
198 printf("\tt n ( ");
199 for (i = 0; i < id; i++)
200 printf("__AROS_LHA(a%d)%s",
201 i + 1,
202 ((i + 1) == id) ? "" : ", \\\n\t"
204 if (id == 0)
205 printf("void ");
206 printf(")\n");
209 void aros_lh(int id, int is_ignored)
211 int i;
213 printf("#define AROS_LH%d%s(t,n,", id, is_ignored ? "I" : "");
214 for (i = 0; i < id; i++)
215 printf("a%d,", i + 1);
216 printf("bt,bn,o,s) \\\n");
217 printf("\tt AROS_SLIB_ENTRY(n,s,o) (void) {");
218 for (i = 0; i < id; i++)
219 printf(" \\\n\t__AROS_LPA(a%d) __attribute__((unused)) __AROS_LCA(a%d) = __AROS_ISREG(a%d,__AROS_FP_REG) ? (__AROS_LPA(a%d))(ULONG)__builtin_frame_address(1) : ({register ULONG __r asm(__AROS_LSA(a%d));(__AROS_LPA(a%d))__r;});", i+1, i+1, i+1, i+1, i+1, i+1);
220 if (!is_ignored)
221 printf(" \\\n\tregister bt __attribute__((unused)) bn = __AROS_ISREG(bn,bt,A6,__AROS_FP_REG) ? (bt)(ULONG)__builtin_frame_address(1) : ({register ULONG __r asm(\"%%a6\");(bt)__r;});");
222 printf("\n");
225 static void aros_lcnr(int id)
227 printf("#define AROS_LC%dNR AROS_LC%d\n", id, id);
230 static void aros_call(int id)
232 int i;
233 printf("#define AROS_CALL%d(t,n,", id);
234 for (i = 0; i < id; i++)
235 printf("a%d,", i + 1);
236 printf("bt,bn) \\\n");
237 printf("\tAROS_UFC%d(t,n", id + 1);
238 for (i = 0; i < id; i++)
240 printf(",AROS_UFCA(a%d)", i + 1);
242 printf(",AROS_UFCA(bt,bn,A6))\n");
245 static void aros_callnr(int id)
247 printf("#define AROS_CALL%dNR AROS_CALL%d\n", id, id);
250 static void aros_lvo_call(int id)
252 int i;
253 printf("#define AROS_LVO_CALL%d(t,", id);
254 for (i = 0; i < id; i++)
255 printf("a%d,", i + 1);
256 printf("bt,bn,o,s) \\\n");
257 printf("\tAROS_CALL%d(t,__AROS_GETVECADDR(bn,o), \\\n", id);
258 for (i = 0; i < id; i++)
259 printf("\t\tAROS_LCA(a%d), \\\n", i + 1);
260 printf("\t\tbt,bn)\n");
263 static void aros_lvo_callnr(int id)
265 int i;
266 printf("#define AROS_LVO_CALL%dNR(t,", id);
267 for (i = 0; i < id; i++)
268 printf("a%d,", i + 1);
269 printf("bt,bn,o,s) \\\n");
270 printf("\tAROS_CALL%dNR(t,__AROS_GETVECADDR(bn,o), \\\n", id);
271 for (i = 0; i < id; i++)
272 printf("\t\tAROS_LCA(a%d), \\\n", i + 1);
273 printf("\t\tbt,bn)\n");
276 static void aros_ld(int id, int is_ignored)
278 int i;
280 printf("#define AROS_LD%d%s(t,n,", id, is_ignored ? "I" : "");
281 for (i = 0; i < id; i++)
282 printf("a%d,", i + 1);
283 printf("bt,bn,o,s) \\\n");
284 printf("\t__AROS_LD_PREFIX t AROS_SLIB_ENTRY(n,s,o) (void)\n");
287 int main(int argc, char **argv)
289 int i;
291 printf("/* AUTOGENERATED by arch/m68k-all/include/gencall.c */\n");
292 printf("/* If you can get this to work for anything other */\n");
293 printf("/* than gcc-4.5.1 m68k-elf, it would be surprising. */\n");
294 printf("\n");
295 printf("#ifndef AROS_M68K_LIBCALL_H\n");
296 printf("#define AROS_M68K_LIBCALL_H\n");
297 printf("\n");
298 printf("/* Call a libary function which requires the libbase */\n");
299 printf("\n");
300 printf("#define __AROS_CPU_SPECIFIC_ASMCALLS\n\n");
302 for (i = 0; i < GENCALL_MAX; i++)
303 aros_ufp(i, 0);
305 for (i = 0; i < GENCALL_MAX; i++)
306 aros_ufp(i, 1);
308 for (i = 0; i < GENCALL_MAX; i++)
309 aros_ufh(i, 0);
311 for (i = 0; i < GENCALL_MAX; i++)
312 aros_ufh(i, 1);
314 for (i = 0; i < GENCALL_MAX; i++)
315 aros_ufc(i);
317 printf("#define __AROS_CPU_SPECIFIC_LP\n\n");
319 for (i = 0; i < GENCALL_MAX; i++)
320 aros_lp(i, 0);
322 for (i = 0; i < GENCALL_MAX; i++)
323 aros_lp(i, 1);
325 printf("\n");
326 printf("#define __AROS_CPU_SPECIFIC_LH\n\n");
328 for (i = 0; i < GENCALL_MAX; i++)
329 aros_lh(i, 0);
331 for (i = 0; i < GENCALL_MAX; i++)
332 aros_lh(i, 1);
334 printf("\n");
335 printf("#define __AROS_CPU_SPECIFIC_LC\n\n");
337 for (i = 0; i < GENCALL_MAX; i++)
338 aros_lc(i, 0);
340 /* For double return AROS_LC2D..AROS_LC4D */
341 aros_lc(2, 1);
342 aros_lc(3, 1);
343 aros_lc(4, 1);
345 for (i = 0; i < GENCALL_MAX; i++)
346 aros_lcnr(i);
348 for (i = 0; i < GENCALL_MAX; i++)
349 aros_call(i);
351 for (i = 0; i < GENCALL_MAX; i++)
352 aros_callnr(i);
354 for (i = 0; i < GENCALL_MAX; i++)
355 aros_lvo_call(i);
357 for (i = 0; i < GENCALL_MAX; i++)
358 aros_lvo_callnr(i);
360 printf("\n");
361 printf("#define __AROS_CPU_SPECIFIC_LD\n\n");
363 for (i = 0; i < GENCALL_MAX; i++)
364 aros_ld(i, 0);
366 for (i = 0; i < GENCALL_MAX; i++)
367 aros_ld(i, 1);
369 printf("#endif /* AROS_M68K_LIBCALL_H */\n");
370 return 0;