2 Copyright © 1995-2001, The AROS Development Team. All rights reserved.
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 m68k-elf ONLY, and even
9 * then it has only been very lightly tested with
10 * "-O2 -fomit-frame-pointer -ffixed-a6"
12 * If it breaks, you get to keep both pieces.
17 #define GENCALL_MAX (13 + 1) /* Max number of arguments */
19 /* NOTE: For all 'call' macros, ie AROS_LC5(), the
20 * 'bt' parameter is frequently garbled by
21 * callers who use '#define's like:
23 * #define UtilityBase mydata->utilitybase
25 * this makes a 'bt' parameter of 'struct UtilityBase *'
26 * turn into 'struct mydata->utilitybase *'.
28 * Unhappiness ensues. So, we must use 'void *'
29 * for all 'bt' arguments in the call macros.
31 void aros_ufp(int id
, int is_static
)
35 printf("#define AROS_UFP%d%s(t,n", id
, is_static
? "S" : "");
36 for (i
= 0; i
< id
; i
++)
37 printf(",a%d", i
+ 1);
39 printf("\t%st n (void)\n", is_static
? "static " : "");
42 void aros_ufh(int id
, int is_static
)
46 printf("#define AROS_UFH%d%s(t,n", id
, is_static
? "S" : "");
47 for (i
= 0; i
< id
; i
++)
48 printf(",a%d", i
+ 1);
50 printf("\t%st n (void) {%s\n", is_static
? "static " : "", (i
==0) ? "" : " \\");
51 for (i
= 0; i
< id
; i
++)
52 printf("\tregister __AROS_UFPA(a%d) __AROS_UFTA(a%d) asm(__AROS_UFSA(a%d)); \\\n", i
+1, i
+1, i
+1);
53 for (i
= 0; i
< id
; i
++)
54 printf("\t__AROS_UFPA(a%d) __attribute__((unused)) __AROS_UFCA(a%d) = __AROS_UFTA(a%d);%s\n", i
+1, i
+1, i
+1, (i
== (id
-1)) ? "" : " \\");
57 static void aros_ufc(int id
)
60 printf("#define AROS_UFC%d(t,n", id
);
61 for (i
= 0; i
< id
; i
++)
62 printf(",a%d", i
+ 1);
64 printf("\t({ volatile register ULONG _ret asm(\"%%d0\"); \\\n");
65 for (i
= 0; i
< id
; i
++) {
66 printf("\t volatile register ULONG __AROS_LTA(a%d) asm(__AROS_LSA(a%d)) = (ULONG)__AROS_LCA(a%d); \\\n",
69 printf("\t asm volatile ( \\\n");
70 printf("\t\t\"pea.l ufc%d_%%c1\\n\" \\\n", id
);
71 printf("\t\t\"move.l %%0, %%%%sp@-\\n\" \\\n");
72 printf("\t\t: : \\\n");
73 printf("\t\t \"g\" (n), \"i\" (__LINE__) \\\n");
74 for (i
= 0; i
< id
; i
++)
75 printf("\t\t, \"r\" (__AROS_LTA(a%d)) \\\n", i
+ 1);
76 printf("\t\t); \\\n");
77 printf("\t asm volatile (\"rts\\nufc%d_%%c0:\\n\" : : \"i\" (__LINE__) : ); \\\n", id
);
78 printf("\t asm volatile (\"\" : \"=r\" (_ret) : : \"%%a0\", \"%%a1\", \"%%d1\", \"cc\", \"memory\"); \\\n");
79 printf("\t (t)_ret;})\n\n");
85 printf("#define AROS_LC%d(t,n,", id
);
86 for (i
= 0; i
< id
; i
++)
87 printf("a%d,", i
+ 1);
88 printf("bt,bn,o,s) \\\n");
89 printf("\t({ volatile register ULONG _ret asm(\"%%d0\"); \\\n");
90 for (i
= 0; i
< id
; i
++) {
91 printf("\t volatile register ULONG __AROS_LTA(a%d) asm(__AROS_LSA(a%d)) = (ULONG)__AROS_LCA(a%d); \\\n",
94 printf("\t volatile register ULONG _bn asm(\"%%a6\") = (ULONG)bn; \\\n");
95 printf("\t asm volatile ( \\\n");
96 printf("\t\t\"jsr %%c0(%%%%a6)\" \\\n");
97 printf("\t\t: : \\\n");
98 printf("\t\t \"i\" (-1 * (o) * LIB_VECTSIZE) \\\n");
99 for (i
= 0; i
< id
; i
++)
100 printf("\t\t, \"r\" (__AROS_LTA(a%d)) \\\n", i
+ 1);
101 printf("\t\t, \"r\" (_bn)); \\\n");
102 printf("\t asm volatile (\"\" : \"=r\" (_ret) : : \"%%a0\", \"%%a1\", \"%%d1\", \"cc\", \"memory\"); \\\n");
103 printf("\t (t)_ret;})\n\n");
106 void aros_lh(int id
, int is_ignored
)
110 printf("#define AROS_LH%d%s(t,n,", id
, is_ignored
? "I" : "");
111 for (i
= 0; i
< id
; i
++)
112 printf("a%d,", i
+ 1);
113 printf("bt,bn,o,s) \\\n");
114 printf("\tt AROS_SLIB_ENTRY(n,s) (void) {");
115 for (i
= 0; i
< id
; i
++)
116 printf(" \\\n\t__AROS_LPA(a%d) __attribute__((unused)) __AROS_LCA(a%d) = ({register ULONG __r asm(__AROS_LSA(a%d));(__AROS_LPA(a%d))__r;});", i
+1, i
+1, i
+1, i
+1);
118 printf(" \\\n\tregister bt __attribute__((unused)) bn = ({register ULONG __r asm(\"%%a6\");(bt)__r;});");
122 static void aros_lcnr(int id
)
124 printf("#define AROS_LC%dNR AROS_LC%d\n", id
, id
);
127 static void aros_call(int id
)
130 printf("#define AROS_CALL%d(t,n,", id
);
131 for (i
= 0; i
< id
; i
++)
132 printf("a%d,", i
+ 1);
133 printf("bt,bn) \\\n");
134 printf("\tAROS_UFC%d(t,n", id
+ 1);
135 for (i
= 0; i
< id
; i
++) {
136 printf(",AROS_UFCA(a%d)", i
+ 1);
138 printf(",AROS_UFCA(bt,bn,A6))\n");
141 static void aros_callnr(int id
)
143 printf("#define AROS_CALL%dNR AROS_CALL%d\n", id
, id
);
146 static void aros_lvo_call(int id
)
149 printf("#define AROS_LVO_CALL%d(t,", id
);
150 for (i
= 0; i
< id
; i
++)
151 printf("a%d,", i
+ 1);
152 printf("bt,bn,o,s) \\\n");
153 printf("\tAROS_CALL%d(t,__AROS_GETVECADDR(bn,o), \\\n", id
);
154 for (i
= 0; i
< id
; i
++)
155 printf("\t\tAROS_LCA(a%d), \\\n", i
+ 1);
156 printf("\t\tbt,bn)\n");
159 static void aros_lvo_callnr(int id
)
162 printf("#define AROS_LVO_CALL%dNR(t,", id
);
163 for (i
= 0; i
< id
; i
++)
164 printf("a%d,", i
+ 1);
165 printf("bt,bn,o,s) \\\n");
166 printf("\tAROS_CALL%dNR(t,__AROS_GETVECADDR(bn,o), \\\n", id
);
167 for (i
= 0; i
< id
; i
++)
168 printf("\t\tAROS_LCA(a%d), \\\n", i
+ 1);
169 printf("\t\tbt,bn)\n");
172 static void aros_ld(int id
, int is_ignored
)
176 printf("#define AROS_LD%d%s(t,n,", id
, is_ignored
? "I" : "");
177 for (i
= 0; i
< id
; i
++)
178 printf("a%d,", i
+ 1);
179 printf("bt,bn,o,s) \\\n");
180 printf("\t__AROS_LD_PREFIX t AROS_SLIB_ENTRY(n,s) (void)\n");
183 int main(int argc
, char **argv
)
187 printf("/* AUTOGENERATED by arch/m68k-all/include/gencall.c */\n");
188 printf("/* If you can get this to work for anything other */\n");
189 printf("/* than gcc-4.5.1 m68k-elf, it would be surprising. */\n");
191 printf("#ifndef AROS_M68K_LIBCALL_H\n");
192 printf("#define AROS_M68K_LIBCALL_H\n");
194 printf("/* Call a libary function which requires the libbase */\n");
196 printf("#define __AROS_CPU_SPECIFIC_ASMCALLS\n\n");
198 for (i
= 0; i
< GENCALL_MAX
; i
++)
201 for (i
= 0; i
< GENCALL_MAX
; i
++)
204 for (i
= 0; i
< GENCALL_MAX
; i
++)
207 for (i
= 0; i
< GENCALL_MAX
; i
++)
210 for (i
= 0; i
< GENCALL_MAX
; i
++)
213 printf("#define __AROS_CPU_SPECIFIC_LH\n\n");
215 for (i
= 0; i
< GENCALL_MAX
; i
++)
218 for (i
= 0; i
< GENCALL_MAX
; i
++)
222 printf("#define __AROS_CPU_SPECIFIC_LC\n\n");
224 for (i
= 0; i
< GENCALL_MAX
; i
++)
227 for (i
= 0; i
< GENCALL_MAX
; i
++)
230 for (i
= 0; i
< GENCALL_MAX
; i
++)
233 for (i
= 0; i
< GENCALL_MAX
; i
++)
236 for (i
= 0; i
< GENCALL_MAX
; i
++)
239 for (i
= 0; i
< GENCALL_MAX
; i
++)
243 printf("#define __AROS_CPU_SPECIFIC_LD\n\n");
245 for (i
= 0; i
< GENCALL_MAX
; i
++)
248 for (i
= 0; i
< GENCALL_MAX
; i
++)
251 printf("#endif /* AROS_M68K_LIBCALL_H */\n");