1/*  This file is part of the program psim.
2
3    Copyright (C) 1994-1995, Andrew Cagney <cagney@highland.com.au>
4
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 2 of the License, or
8    (at your option) any later version.
9
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with this program; if not, write to the Free Software
17    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
19    */
20
21
22#ifndef _INLINE_H_
23#define _INLINE_H_
24
25
26#define STATIC(TYPE) static TYPE
27
28
29/* sim_endian is always inlined */
30
31#if !defined(_SIM_ENDIAN_C_) && (SIM_ENDIAN_INLINE & INCLUDE_MODULE)
32# if (SIM_ENDIAN_INLINE & INLINE_MODULE)
33#  define INLINE_PSIM_ENDIAN(TYPE) static INLINE TYPE UNUSED
34#  define EXTERN_PSIM_ENDIAN(TYPE) static TYPE UNUSED
35# else
36#  define INLINE_PSIM_ENDIAN(TYPE) static TYPE UNUSED
37#  define EXTERN_PSIM_ENDIAN(TYPE) static TYPE UNUSED
38# endif
39#else
40# define INLINE_PSIM_ENDIAN(TYPE) TYPE
41# define EXTERN_PSIM_ENDIAN(TYPE) TYPE
42#endif
43
44#if (SIM_ENDIAN_INLINE & PSIM_INLINE_LOCALS)
45# define STATIC_INLINE_PSIM_ENDIAN(TYPE) static INLINE TYPE
46#else
47# define STATIC_INLINE_PSIM_ENDIAN(TYPE) static TYPE
48#endif
49
50
51/* bits is always inlined */
52
53#if !defined(_BITS_C_) && (BITS_INLINE & INCLUDE_MODULE)
54# if (BITS_INLINE & INLINE_MODULE)
55#  define INLINE_BITS(TYPE) static INLINE TYPE UNUSED
56#  define EXTERN_BITS(TYPE) static TYPE UNUSED
57# else
58#  define INLINE_BITS(TYPE) static TYPE UNUSED
59#  define EXTERN_BITS(TYPE) static TYPE UNUSED
60# endif
61#else
62# define INLINE_BITS(TYPE) TYPE
63# define EXTERN_BITS(TYPE) TYPE
64#endif
65
66#if (BITS_INLINE & PSIM_INLINE_LOCALS)
67# define STATIC_INLINE_BITS(TYPE) static INLINE TYPE
68#else
69# define STATIC_INLINE_BITS(TYPE) static TYPE
70#endif
71
72
73/* core is inlined with inline.c */
74
75#if defined(_INLINE_C_) && !defined(_CORE_C_) && (CORE_INLINE & INCLUDE_MODULE)
76# if (CORE_INLINE & INLINE_MODULE)
77#  define INLINE_CORE(TYPE) static INLINE TYPE UNUSED
78#  define EXTERN_CORE(TYPE) static TYPE UNUSED
79#else
80#  define INLINE_CORE(TYPE) static TYPE UNUSED
81#  define EXTERN_CORE(TYPE) static TYPE UNUSED
82#endif
83#else
84# define INLINE_CORE(TYPE) TYPE
85# define EXTERN_CORE(TYPE) TYPE
86#endif
87
88#if (CORE_INLINE & PSIM_INLINE_LOCALS)
89# define STATIC_INLINE_CORE(TYPE) static INLINE TYPE
90#else
91# define STATIC_INLINE_CORE(TYPE) static TYPE
92#endif
93
94
95/* vm is inlined with inline.c */
96
97#if defined(_INLINE_C_) && !defined(_VM_C_) && (VM_INLINE & INCLUDE_MODULE)
98# if (VM_INLINE & INLINE_MODULE)
99#  define INLINE_VM(TYPE) static INLINE TYPE UNUSED
100#  define EXTERN_VM(TYPE) static TYPE UNUSED
101#else
102#  define INLINE_VM(TYPE) static TYPE UNUSED
103#  define EXTERN_VM(TYPE) static TYPE UNUSED
104#endif
105#else
106# define INLINE_VM(TYPE) TYPE
107# define EXTERN_VM(TYPE) TYPE
108#endif
109
110#if (VM_INLINE & PSIM_INLINE_LOCALS)
111# define STATIC_INLINE_VM(TYPE) static INLINE TYPE
112#else
113# define STATIC_INLINE_VM(TYPE) static TYPE
114#endif
115
116
117/* cpu is always inlined */
118
119#if !defined(_CPU_C_) && (CPU_INLINE & INCLUDE_MODULE)
120# if (CPU_INLINE & INLINE_MODULE)
121#  define INLINE_CPU(TYPE) static INLINE TYPE UNUSED
122#  define EXTERN_CPU(TYPE) static TYPE UNUSED
123#else
124#  define INLINE_CPU(TYPE) static TYPE UNUSED
125#  define EXTERN_CPU(TYPE) static TYPE UNUSED
126#endif
127#else
128# define INLINE_CPU(TYPE) TYPE
129# define EXTERN_CPU(TYPE) TYPE
130#endif
131
132#if (CPU_INLINE & PSIM_INLINE_LOCALS)
133# define STATIC_INLINE_CPU(TYPE) static INLINE TYPE
134#else
135# define STATIC_INLINE_CPU(TYPE) static TYPE
136#endif
137
138
139/* model is inlined with inline.c */
140
141#if defined(_INLINE_C_) && !defined(_MODEL_C_) && (MODEL_INLINE & INCLUDE_MODULE)
142# if (MODEL_INLINE & INLINE_MODULE)
143#  define INLINE_MODEL(TYPE) static INLINE TYPE UNUSED
144#  define EXTERN_MODEL(TYPE) static TYPE UNUSED
145#else
146#  define INLINE_MODEL(TYPE) static TYPE UNUSED
147#  define EXTERN_MODEL(TYPE) static TYPE UNUSED
148#endif
149#else
150# define INLINE_MODEL(TYPE) TYPE
151# define EXTERN_MODEL(TYPE) TYPE
152#endif
153
154#if (MODEL_INLINE & PSIM_INLINE_LOCALS)
155# define STATIC_INLINE_MODEL(TYPE) static INLINE TYPE
156#else
157# define STATIC_INLINE_MODEL(TYPE) static TYPE
158#endif
159
160
161/* events is inlined with inline.c */
162
163#if defined(_INLINE_C_) && !defined(_EVENTS_C_) && (EVENTS_INLINE & INCLUDE_MODULE)
164# if (EVENTS_INLINE & INLINE_MODULE)
165#  define INLINE_EVENTS(TYPE) static INLINE TYPE UNUSED
166#  define EXTERN_EVENTS(TYPE) static TYPE UNUSED
167#else
168#  define INLINE_EVENTS(TYPE) static TYPE UNUSED
169#  define EXTERN_EVENTS(TYPE) static TYPE UNUSED
170#endif
171#else
172# define INLINE_EVENTS(TYPE) TYPE
173# define EXTERN_EVENTS(TYPE) TYPE
174#endif
175
176#if (EVENTS_INLINE & PSIM_INLINE_LOCALS)
177# define STATIC_INLINE_EVENTS(TYPE) static INLINE TYPE
178#else
179# define STATIC_INLINE_EVENTS(TYPE) static TYPE
180#endif
181
182
183/* mon is inlined with inline.c */
184
185#if defined(_INLINE_C_) && !defined(_MON_C_) && (MON_INLINE & INCLUDE_MODULE)
186# if (MON_INLINE & INLINE_MODULE)
187#  define INLINE_MON(TYPE) static INLINE TYPE UNUSED
188#  define EXTERN_MON(TYPE) static TYPE UNUSED
189#else
190#  define INLINE_MON(TYPE) static TYPE UNUSED
191#  define EXTERN_MON(TYPE) static TYPE UNUSED
192#endif
193#else
194# define INLINE_MON(TYPE) TYPE
195# define EXTERN_MON(TYPE) TYPE
196#endif
197
198#if (MON_INLINE & PSIM_INLINE_LOCALS)
199# define STATIC_INLINE_MON(TYPE) static INLINE TYPE
200#else
201# define STATIC_INLINE_MON(TYPE) static TYPE
202#endif
203
204
205/* registers is inlined with inline.c */
206
207#if defined(_INLINE_C_) && !defined(_REGISTERS_C_) && (REGISTERS_INLINE & INCLUDE_MODULE)
208# if (REGISTERS_INLINE & INLINE_MODULE)
209#  define INLINE_REGISTERS(TYPE) static INLINE TYPE UNUSED
210#  define EXTERN_REGISTERS(TYPE) static TYPE UNUSED
211#else
212#  define INLINE_REGISTERS(TYPE) static TYPE UNUSED
213#  define EXTERN_REGISTERS(TYPE) static TYPE UNUSED
214#endif
215#else
216# define INLINE_REGISTERS(TYPE) TYPE
217# define EXTERN_REGISTERS(TYPE) TYPE
218#endif
219
220#if (REGISTERS_INLINE & PSIM_INLINE_LOCALS)
221# define STATIC_INLINE_REGISTERS(TYPE) static INLINE TYPE
222#else
223# define STATIC_INLINE_REGISTERS(TYPE) static TYPE
224#endif
225
226
227/* interrupts is inlined with inline.c */
228
229#if defined(_INLINE_C_) && !defined(_INTERRUPTS_C_) && (INTERRUPTS_INLINE & INCLUDE_MODULE)
230# if (INTERRUPTS_INLINE & INLINE_MODULE)
231#  define INLINE_INTERRUPTS(TYPE) static INLINE TYPE UNUSED
232#  define EXTERN_INTERRUPTS(TYPE) static TYPE UNUSED
233#else
234#  define INLINE_INTERRUPTS(TYPE) static TYPE UNUSED
235#  define EXTERN_INTERRUPTS(TYPE) static TYPE UNUSED
236#endif
237#else
238# define INLINE_INTERRUPTS(TYPE) TYPE
239# define EXTERN_INTERRUPTS(TYPE) TYPE
240#endif
241
242#if (INTERRUPTS_INLINE & PSIM_INLINE_LOCALS)
243# define STATIC_INLINE_INTERRUPTS(TYPE) static INLINE TYPE
244#else
245# define STATIC_INLINE_INTERRUPTS(TYPE) static TYPE
246#endif
247
248
249/* device is inlined with inline.c */
250
251#if defined(_INLINE_C_) && !defined(_DEVICE_C_) && (DEVICE_INLINE & INCLUDE_MODULE)
252# if (DEVICE_INLINE & INLINE_MODULE)
253#  define INLINE_DEVICE(TYPE) static INLINE TYPE UNUSED
254#  define EXTERN_DEVICE(TYPE) static TYPE UNUSED
255#else
256#  define INLINE_DEVICE(TYPE) static TYPE UNUSED
257#  define EXTERN_DEVICE(TYPE) static TYPE UNUSED
258#endif
259#else
260# define INLINE_DEVICE(TYPE) TYPE
261# define EXTERN_DEVICE(TYPE) TYPE
262#endif
263
264#if (DEVICE_INLINE & PSIM_INLINE_LOCALS)
265# define STATIC_INLINE_DEVICE(TYPE) static INLINE TYPE
266#else
267# define STATIC_INLINE_DEVICE(TYPE) static TYPE
268#endif
269
270
271/* tree is inlined with inline.c */
272
273#if defined(_INLINE_C_) && !defined(_TREE_C_) && (TREE_INLINE & INCLUDE_MODULE)
274# if (TREE_INLINE & INLINE_MODULE)
275#  define INLINE_TREE(TYPE) static INLINE TYPE UNUSED
276#  define EXTERN_TREE(TYPE) static TYPE UNUSED
277#else
278#  define INLINE_TREE(TYPE) static TYPE UNUSED
279#  define EXTERN_TREE(TYPE) static TYPE UNUSED
280#endif
281#else
282# define INLINE_TREE(TYPE) TYPE
283# define EXTERN_TREE(TYPE) TYPE
284#endif
285
286#if (TREE_INLINE & PSIM_INLINE_LOCALS)
287# define STATIC_INLINE_TREE(TYPE) static INLINE TYPE
288#else
289# define STATIC_INLINE_TREE(TYPE) static TYPE
290#endif
291
292
293/* spreg is inlined with inline.c */
294
295#if defined(_INLINE_C_) && !defined(_SPREG_C_) && (SPREG_INLINE & INCLUDE_MODULE)
296# if (SPREG_INLINE & INLINE_MODULE)
297#  define INLINE_SPREG(TYPE) static INLINE TYPE UNUSED
298#  define EXTERN_SPREG(TYPE) static TYPE UNUSED
299#else
300#  define INLINE_SPREG(TYPE) static TYPE UNUSED
301#  define EXTERN_SPREG(TYPE) static TYPE UNUSED
302#endif
303#else
304# define INLINE_SPREG(TYPE) TYPE
305# define EXTERN_SPREG(TYPE) TYPE
306#endif
307
308#if (SPREG_INLINE & PSIM_INLINE_LOCALS)
309# define STATIC_INLINE_SPREG(TYPE) static INLINE TYPE
310#else
311# define STATIC_INLINE_SPREG(TYPE) static TYPE
312#endif
313
314
315/* semantics is inlined with inline.c */
316
317#if defined(_INLINE_C_) && !defined(_SEMANTICS_C_) && (SEMANTICS_INLINE & INCLUDE_MODULE)
318# if (SEMANTICS_INLINE & INLINE_MODULE)
319#  define PSIM_INLINE_SEMANTICS(TYPE) static INLINE TYPE UNUSED
320#  define PSIM_EXTERN_SEMANTICS(TYPE) static TYPE UNUSED REGPARM
321#else
322#  define PSIM_INLINE_SEMANTICS(TYPE) static TYPE UNUSED REGPARM
323#  define PSIM_EXTERN_SEMANTICS(TYPE) static TYPE UNUSED REGPARM
324#endif
325#else
326# define PSIM_INLINE_SEMANTICS(TYPE) TYPE REGPARM
327# define PSIM_EXTERN_SEMANTICS(TYPE) TYPE REGPARM
328#endif
329
330#if 0 /* this isn't used */
331#if (SEMANTICS_INLINE & PSIM_INLINE_LOCALS)
332# define STATIC_INLINE_SEMANTICS(TYPE) static INLINE TYPE
333#else
334# define STATIC_INLINE_SEMANTICS(TYPE) static TYPE REGPARM
335#endif
336#endif
337
338
339/* idecode is actually not inlined */
340
341#if defined(_INLINE_C_) && !defined(_IDECODE_C_) && (IDECODE_INLINE & INCLUDE_MODULE)
342# if (IDECODE_INLINE & INLINE_MODULE)
343#  define PSIM_INLINE_IDECODE(TYPE) static INLINE TYPE UNUSED
344#  define EXTERN_IDECODE(TYPE) static TYPE UNUSED REGPARM
345#else
346#  define PSIM_INLINE_IDECODE(TYPE) static TYPE UNUSED REGPARM
347#  define EXTERN_IDECODE(TYPE) static TYPE UNUSED REGPARM
348#endif
349#else
350# define PSIM_INLINE_IDECODE(TYPE) TYPE REGPARM
351# define EXTERN_IDECODE(TYPE) TYPE REGPARM
352#endif
353
354#if 0 /* this isn't used */
355#if (IDECODE_INLINE & PSIM_INLINE_LOCALS)
356# define STATIC_INLINE_IDECODE(TYPE) static INLINE TYPE
357#else
358# define STATIC_INLINE_IDECODE(TYPE) static TYPE REGPARM
359#endif
360#endif
361
362
363/* icache is inlined with inline.c */
364
365#if defined(_INLINE_C_) && !defined(_ICACHE_C_) && (ICACHE_INLINE & INCLUDE_MODULE)
366# if (ICACHE_INLINE & INLINE_MODULE)
367#  define PSIM_INLINE_ICACHE(TYPE) static INLINE TYPE UNUSED
368#  define EXTERN_ICACHE(TYPE) static TYPE UNUSED REGPARM
369#else
370#  define PSIM_INLINE_ICACHE(TYPE) static TYPE UNUSED REGPARM
371#  define EXTERN_ICACHE(TYPE) static TYPE UNUSED REGPARM
372#endif
373#else
374# define PSIM_INLINE_ICACHE(TYPE) TYPE REGPARM
375# define EXTERN_ICACHE(TYPE) TYPE REGPARM
376#endif
377
378#if 0 /* this isn't used */
379#if (ICACHE_INLINE & PSIM_INLINE_LOCALS)
380# define STATIC_INLINE_ICACHE(TYPE) static INLINE TYPE
381#else
382# define STATIC_INLINE_ICACHE(TYPE) static TYPE REGPARM
383#endif
384#endif
385
386
387/* support is always inlined */
388
389#if !defined(_SUPPORT_C_) && (SUPPORT_INLINE & INCLUDE_MODULE)
390# if (SUPPORT_INLINE & INLINE_MODULE)
391#  define PSIM_INLINE_SUPPORT(TYPE) static INLINE TYPE UNUSED
392#  define EXTERN_SUPPORT(TYPE) static TYPE UNUSED
393#else
394#  define PSIM_INLINE_SUPPORT(TYPE) static TYPE UNUSED
395#  define EXTERN_SUPPORT(TYPE) static TYPE UNUSED
396#endif
397#else
398# define PSIM_INLINE_SUPPORT(TYPE) TYPE
399# define EXTERN_SUPPORT(TYPE) TYPE
400#endif
401
402#if 0 /* this isn't used */
403#if (SUPPORT_INLINE & PSIM_INLINE_LOCALS)
404# define STATIC_INLINE_SUPPORT(TYPE) static INLINE TYPE
405#else
406# define STATIC_INLINE_SUPPORT(TYPE) static TYPE
407#endif
408#endif
409
410
411/* options is inlined with inline.c */
412
413#if defined(_INLINE_C_) && !defined(_OPTIONS_C_) && (OPTIONS_INLINE & INCLUDE_MODULE)
414# if (OPTIONS_INLINE & INLINE_MODULE)
415#  define INLINE_OPTIONS(TYPE) static INLINE TYPE UNUSED
416#  define EXTERN_OPTIONS(TYPE) static TYPE UNUSED
417#else
418#  define INLINE_OPTIONS(TYPE) static TYPE UNUSED
419#  define EXTERN_OPTIONS(TYPE) static TYPE UNUSED
420#endif
421#else
422# define INLINE_OPTIONS(TYPE) TYPE
423# define EXTERN_OPTIONS(TYPE) TYPE
424#endif
425
426#if (OPTIONS_INLINE & PSIM_INLINE_LOCALS)
427# define STATIC_INLINE_OPTIONS(TYPE) static INLINE TYPE
428#else
429# define STATIC_INLINE_OPTIONS(TYPE) static TYPE
430#endif
431
432
433/* os_emul is inlined with inline.c */
434
435#if defined(_INLINE_C_) && !defined(_OS_EMUL_C_) && (OS_EMUL_INLINE & INCLUDE_MODULE)
436# if (OS_EMUL_INLINE & INLINE_MODULE)
437#  define INLINE_OS_EMUL(TYPE) static INLINE TYPE UNUSED
438#  define EXTERN_OS_EMUL(TYPE) static TYPE UNUSED
439#else
440#  define INLINE_OS_EMUL(TYPE) static TYPE UNUSED
441#  define EXTERN_OS_EMUL(TYPE) static TYPE UNUSED
442#endif
443#else
444# define INLINE_OS_EMUL(TYPE) TYPE
445# define EXTERN_OS_EMUL(TYPE) TYPE
446#endif
447
448#if (OS_EMUL_INLINE & PSIM_INLINE_LOCALS)
449# define STATIC_INLINE_OS_EMUL(TYPE) static INLINE TYPE
450#else
451# define STATIC_INLINE_OS_EMUL(TYPE) static TYPE
452#endif
453
454
455/* psim is actually not inlined */
456
457#if defined(_INLINE_C_) && !defined(_PSIM_C_) && (PSIM_INLINE & INCLUDE_MODULE)
458# if (PSIM_INLINE & INLINE_MODULE)
459#  define INLINE_PSIM(TYPE) static INLINE TYPE UNUSED
460#  define EXTERN_PSIM(TYPE) static TYPE UNUSED
461#else
462#  define INLINE_PSIM(TYPE) static TYPE UNUSED
463#  define EXTERN_PSIM(TYPE) static TYPE UNUSED
464#endif
465#else
466# define INLINE_PSIM(TYPE) TYPE
467# define EXTERN_PSIM(TYPE) TYPE
468#endif
469
470#if (PSIM_INLINE & PSIM_INLINE_LOCALS)
471# define STATIC_INLINE_PSIM(TYPE) static INLINE TYPE
472#else
473# define STATIC_INLINE_PSIM(TYPE) static TYPE
474#endif
475
476
477/* cap is inlined with inline.c */
478
479#if defined(_INLINE_C_) && !defined(_CAP_C_) && (CAP_INLINE & INCLUDE_MODULE)
480# if (CAP_INLINE & INLINE_MODULE)
481#  define INLINE_CAP(TYPE) static INLINE TYPE UNUSED
482#  define EXTERN_CAP(TYPE) static TYPE UNUSED
483#else
484#  define INLINE_CAP(TYPE) static TYPE UNUSED
485#  define EXTERN_CAP(TYPE) static TYPE UNUSED
486#endif
487#else
488# define INLINE_CAP(TYPE) TYPE
489# define EXTERN_CAP(TYPE) TYPE
490#endif
491
492#if (CAP_INLINE & PSIM_INLINE_LOCALS)
493# define STATIC_INLINE_CAP(TYPE) static INLINE TYPE
494#else
495# define STATIC_INLINE_CAP(TYPE) static TYPE
496#endif
497
498#endif
499