1 /*	Id: macdefs.h,v 1.10 2009/09/19 23:49:43 gmcgarry Exp 	*/
2 /*	$NetBSD: macdefs.h,v 1.1.1.3 2010/06/03 18:57:28 plunky Exp $	*/
3 /*
4  * Copyright (c) 2003 Anders Magnusson (ragge@ludd.luth.se).
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. The name of the author may not be used to endorse or promote products
16  *    derived from this software without specific prior written permission
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29 
30 /*
31  * Machine-dependent defines for both passes.
32  */
33 
34 /*
35  * Convert (multi-)character constant to integer.
36  */
37 #define makecc(val,i)	lastcon = (lastcon<<8)|((val<<24)>>24);
38 
39 /*
40  * Storage space requirements
41  */
42 #define SZCHAR		8
43 #define SZBOOL		32
44 #define SZINT		32
45 #define SZFLOAT		32
46 #define SZDOUBLE	64
47 #ifdef ELFABI
48 #define SZLDOUBLE	96
49 #else
50 #define SZLDOUBLE	128
51 #endif
52 #define SZLONG		32
53 #define SZSHORT		16
54 #define SZLONGLONG	64
55 #define SZPOINT(t)	32
56 
57 /*
58  * Alignment constraints
59  */
60 #define ALCHAR		8
61 #define ALBOOL		32
62 #define ALINT		32
63 #define ALFLOAT		32
64 #define ALDOUBLE	32
65 #ifdef ELFABI
66 #define ALLDOUBLE	32
67 #else
68 #define ALLDOUBLE	128
69 #endif
70 #define ALLONG		32
71 #ifdef ELFABI
72 #define ALLONGLONG	64
73 #else
74 #define ALLONGLONG	32
75 #endif
76 #define ALSHORT		16
77 #define ALPOINT		32
78 #define ALSTRUCT	32
79 #define ALSTACK		(16*SZCHAR)
80 
81 /*
82  * Min/max values.
83  */
84 #define	MIN_CHAR	-128
85 #define	MAX_CHAR	127
86 #define	MAX_UCHAR	255
87 #define	MIN_SHORT	-32768
88 #define	MAX_SHORT	32767
89 #define	MAX_USHORT	65535
90 #define	MIN_INT		-1
91 #define	MAX_INT		0x7fffffff
92 #define	MAX_UNSIGNED	0xffffffff
93 #define	MIN_LONG	MIN_INT
94 #define	MAX_LONG	MAX_INT
95 #define	MAX_ULONG	MAX_UNSIGNED
96 #define	MIN_LONGLONG	0x8000000000000000LL
97 #define	MAX_LONGLONG	0x7fffffffffffffffLL
98 #define	MAX_ULONGLONG	0xffffffffffffffffULL
99 
100 #define CHAR_UNSIGNED
101 #define	BOOL_TYPE	INT	/* what used to store _Bool */
102 
103 /*
104  * Use large-enough types.
105  */
106 typedef	long long CONSZ;
107 typedef	unsigned long long U_CONSZ;
108 typedef long long OFFSZ;
109 
110 #define CONFMT	"%lld"		/* format for printing constants */
111 #if defined(ELFABI)
112 #define LABFMT	".L%d"		/* format for printing labels */
113 #define REGPREFIX	"%"	/* format for printing registers */
114 #elif defined(MACHOABI)
115 #define LABFMT	"L%d"		/* format for printing labels */
116 #define REGPREFIX
117 #else
118 #error undefined ABI
119 #endif
120 #define	STABLBL	"LL%d"		/* format for stab (debugging) labels */
121 
122 #ifdef MACHOABI
123 #define STAB_LINE_ABSOLUTE	/* S_LINE fields use absolute addresses */
124 #endif
125 
126 #undef	FIELDOPS		/* no bit-field instructions */
127 
128 #define ENUMSIZE(high,low) INT	/* enums are always stored in full int */
129 
130 /* Definitions mostly used in pass2 */
131 
132 #define BYTEOFF(x)	((x)&03)
133 #define BITOOR(x)	(x)	/* bit offset to oreg offset XXX die! */
134 
135 #define	szty(t)	(((t) == DOUBLE || (t) == LDOUBLE || \
136 	DEUNSIGN(t) == LONGLONG) ? 2 : 1)
137 
138 /*
139  * The PPC register definition are taken from apple docs.
140  *
141  * The classes used are:
142  *	A - general registers
143  *	B - 64-bit register pairs
144  *	C - floating-point registers
145  */
146 
147 #define R0	0	/* scratch register */
148 #define R1	1	/* stack base pointer */
149 #define R2	2
150 #define R3	3	/* return register / argument 0 */
151 #define R4	4	/* return register (for longlong) / argument 1 */
152 #define R5	5	/* scratch register / argument 2 */
153 #define R6	6	/* scratch register / argument 3 */
154 #define R7	7	/* scratch register / argument 4 */
155 #define R8	8	/* scratch register / argument 5 */
156 #define R9	9	/* scratch register / argument 6 */
157 #define R10	10	/* scratch register / argument 7 */
158 #define R11	11	/* scratch register */
159 #define R12	12	/* scratch register */
160 #define R13	13
161 #define R14	14
162 #define R15	15
163 #define R16	16
164 #define R17	17
165 #define R18	18
166 #define R19	19
167 #define R20	20
168 #define R21	21
169 #define R22	22
170 #define R23	23
171 #define R24	24
172 #define R25	25
173 #define R26	26
174 #define R27	27
175 #define R28	28
176 #define R29	29
177 #define R30	30
178 #define R31	31
179 
180 #define R3R4	32
181 #define R4R5	33
182 #define R5R6	34
183 #define R6R7	35
184 #define R7R8	36
185 #define R8R9	37
186 #define R9R10	38
187 #define R14R15	39
188 #define R16R17	40
189 #define R18R19	41
190 #define R20R21	42
191 #define R22R23	43
192 #define R24R25	44
193 #define R26R27	45
194 #define R28R29	46
195 #define R30R31	47
196 
197 #define F0	48	/* scratch register */
198 #define F1	49	/* return value 0 / argument 0 */
199 #define F2	50	/* return value 1 / argument 1 */
200 #define F3	51	/* return value 2 / argument 2 */
201 #define F4	52	/* return value 3 / argument 3 */
202 #define F5	53	/* argument 4 */
203 #define F6	54	/* argument 5 */
204 #define F7	55	/* argument 6 */
205 #define F8	56	/* argument 7 */
206 #define F9	57	/* argument 8 */
207 #define F10	58	/* argument 9 */
208 #define F11	59	/* argument 10 */
209 #define F12	60	/* argument 11 */
210 #define F13	61	/* argument 12 */
211 #define F14	62
212 #define F15	63
213 #define F16	64
214 #define F17	65
215 #define F18	66
216 #define F19	67
217 #define F20	68
218 #define F21	69
219 #define F22	70
220 #define F23	71
221 #define F24	72
222 #define F25	73
223 #define F26	74
224 #define F27	75
225 #define F28	76
226 #define F29	77
227 #define F30	78
228 #define F31	79
229 
230 #define NUMCLASS 3
231 #define	MAXREGS	64		/* XXX cannot have more than 64 */
232 
233 #define RSTATUS 				\
234 	0,			/* R0 */	\
235 	0,			/* R1 */	\
236 	SAREG|TEMPREG,		/* R2 */	\
237 	SAREG|TEMPREG,		/* R3 */	\
238 	SAREG|TEMPREG,		/* R4 */	\
239 	SAREG|TEMPREG,		/* R5 */	\
240 	SAREG|TEMPREG,		/* R6 */	\
241 	SAREG|TEMPREG,		/* R7 */	\
242 	SAREG|TEMPREG,		/* R8 */	\
243 	SAREG|TEMPREG,		/* R9 */	\
244 	SAREG|TEMPREG,		/* R10 */	\
245 	SAREG|TEMPREG,		/* R11 */	\
246 	SAREG|TEMPREG,		/* R12 */	\
247 	SAREG,			/* R13 */	\
248 	SAREG,			/* R14 */	\
249 	SAREG,			/* R15 */	\
250 	SAREG,			/* R16 */	\
251 	SAREG,			/* R17 */	\
252 	SAREG,			/* R18 */	\
253 	SAREG,			/* R19 */	\
254 	SAREG,			/* R20 */	\
255 	SAREG,			/* R21 */	\
256 	SAREG,			/* R22 */	\
257 	SAREG,			/* R23 */	\
258 	SAREG,			/* R24 */	\
259 	SAREG,			/* R25 */	\
260 	SAREG,			/* R26 */	\
261 	SAREG,			/* R27 */	\
262 	SAREG,			/* R28 */	\
263 	SAREG,			/* R29 */	\
264 	SAREG,			/* R30 */	\
265 	SAREG,			/* R31 */	\
266 	\
267         SBREG|TEMPREG,		/* R3R4 */	\
268 	SBREG|TEMPREG,		/* R4R5 */	\
269 	SBREG|TEMPREG,		/* R5R6 */	\
270 	SBREG|TEMPREG,		/* R6R7 */	\
271         SBREG|TEMPREG,		/* R7R8 */	\
272 	SBREG|TEMPREG,		/* R8R9 */	\
273 	SBREG|TEMPREG,		/* R9R10 */	\
274 	\
275 	SBREG,			/* R14R15 */	\
276 	SBREG,			/* R16R17 */	\
277 	SBREG,			/* R18R19 */	\
278 	SBREG,			/* R20R21 */	\
279 	SBREG,			/* R22R23 */	\
280 	SBREG,			/* R24R25 */	\
281 	SBREG,			/* R26R2k */	\
282 	SBREG,			/* R28R29 */	\
283 	SBREG, 			/* R30R31 */	\
284 	\
285 	SCREG|TEMPREG,		/* F0 */	\
286 	SCREG|TEMPREG,		/* F1 */	\
287 	SCREG|TEMPREG,		/* F2 */	\
288 	SCREG|TEMPREG,		/* F3 */	\
289 	SCREG|TEMPREG,		/* F4 */	\
290 	SCREG|TEMPREG,		/* F5 */	\
291 	SCREG|TEMPREG,		/* F6 */	\
292 	SCREG|TEMPREG,		/* F7 */	\
293 	SCREG|TEMPREG,		/* F8 */	\
294 	SCREG|TEMPREG,		/* F9 */	\
295 	SCREG|TEMPREG,		/* F10 */	\
296 	SCREG|TEMPREG,		/* F11 */	\
297 	SCREG|TEMPREG,		/* F12 */	\
298 	SCREG|TEMPREG,		/* F13 */	\
299 	SCREG,			/* F14 */	\
300 	SCREG,			/* F15 */	\
301 
302 #define ROVERLAP \
303 	{ -1 }, { -1 }, { -1 },			\
304 	{ R3R4,       -1 }, { R3R4, R4R5, -1 },	\
305 	{ R4R5, R5R6, -1 }, { R5R6, R6R7, -1 },	\
306 	{ R6R7, R7R8, -1 }, { R7R8, R8R9, -1 },	\
307 	{ R8R9, R9R10, -1 }, { R9R10, -1 },	\
308 	{ -1 }, { -1 }, { -1 },			\
309 	{ R14R15, -1 }, { R14R15, -1 }, 	\
310 	{ R16R17, -1 }, { R16R17, -1 },		\
311 	{ R18R19, -1 }, { R18R19, -1 }, 	\
312 	{ R20R21, -1 }, { R20R21, -1 },		\
313 	{ R22R23, -1 }, { R22R23, -1 }, 	\
314 	{ R24R25, -1 }, { R24R25, -1 },		\
315 	{ R26R27, -1 }, { R26R27, -1 }, 	\
316 	{ R28R29, -1 }, { R28R29, -1 },		\
317 	{ R30R31, -1 }, { R30R31, -1 }, 	\
318 	\
319 	{ R3, R4,       R4R5, -1 }, { R4, R5, R3R4, R5R6, -1 },	\
320 	{ R5, R6, R4R5, R6R7, -1 }, { R6, R7, R5R6, R7R8, -1 },	\
321 	{ R7, R8, R6R7, R8R9, -1 }, { R8, R9, R7R8, R8R9, -1 }, \
322 	{ R9, R10, R8R9,      -1 }, 	\
323 	{ R14, R15, -1 }, { R16, R17, -1 },	\
324 	{ R18, R19, -1 }, { R20, R21, -1 }, 	\
325 	{ R22, R23, -1 }, { R24, R25, -1 },	\
326 	{ R26, R27, -1 }, { R28, R29, -1 }, 	\
327 	{ R30, R31, -1 },		\
328 	\
329 	{ -1 }, { -1 }, { -1 }, { -1 },		\
330 	{ -1 }, { -1 }, { -1 }, { -1 },		\
331 	{ -1 }, { -1 }, { -1 }, { -1 },		\
332 	{ -1 }, { -1 }, { -1 }, { -1 },		\
333 
334 /*
335  * According to the ABI documents, there isn't really a frame pointer;
336  * all references to data on the stack (autos and parameters) are
337  * indexed relative to the stack pointer.  However, pcc isn't really
338  * capable of running in this manner, and expects a frame pointer.
339  */
340 #define SPREG   R1	/* stack pointer */
341 #define FPREG   R30	/* frame pointer */
342 #define GOTREG	R31	/* global offset table (PIC) */
343 
344 #ifdef FPREG
345 #define ARGINIT		(24*8)	/* # bits above fp where arguments start */
346 #define AUTOINIT	(8*8)	/* # bits above fp where automatics start */
347 #define BACKAUTO 		/* stack grows negatively for automatics */
348 #define BACKTEMP 		/* stack grows negatively for temporaries */
349 #else
350 #define ARGINIT		(24*8)	/* # bits above fp where arguments start */
351 #define AUTOINIT	(56*8)	/* # bits above fp where automatics start */
352 #endif
353 
354 /* Return a register class based on the type of the node */
355 #define PCLASS(p)	(1 << gclass((p)->n_type))
356 
357 #define GCLASS(x)	((x) < 32 ? CLASSA : ((x) < 48 ? CLASSB : CLASSC))
358 #define DECRA(x,y)	(((x) >> (y*6)) & 63)   /* decode encoded regs */
359 #define ENCRA(x,y)	((x) << (6+y*6))        /* encode regs in int */
360 #define ENCRD(x)	(x)		/* Encode dest reg in n_reg */
361 #define RETREG(x)	retreg(x)
362 
363 int COLORMAP(int c, int *r);
364 int retreg(int ty);
365 
366 #define	SHSTR		(MAXSPECIAL+1)	/* short struct */
367 #define	SFUNCALL	(MAXSPECIAL+2)	/* struct assign after function call */
368 #define SPCON		(MAXSPECIAL+3)  /* positive constant */
369 
370 int features(int f);
371 #define FEATURE_BIGENDIAN	0x00010000
372 #define FEATURE_PIC		0x00020000
373 #define FEATURE_HARDFLOAT	0x00040000
374 
375 struct stub {
376 	struct { struct stub *q_forw, *q_back; } link;
377 	char *name;
378 };
379 extern struct stub stublist;
380 extern struct stub nlplist;
381 void addstub(struct stub *list, char *name);
382 
383 #define TARGET_STDARGS
384 #define TARGET_BUILTINS							\
385 	{ "__builtin_stdarg_start", powerpc_builtin_stdarg_start },	\
386 	{ "__builtin_va_arg", powerpc_builtin_va_arg },			\
387 	{ "__builtin_va_end", powerpc_builtin_va_end },			\
388 	{ "__builtin_va_copy", powerpc_builtin_va_copy },		\
389 	{ "__builtin_frame_address", powerpc_builtin_frame_address },	\
390 	{ "__builtin_return_address", powerpc_builtin_return_address },
391 
392 #define NODE struct node
393 struct node;
394 NODE *powerpc_builtin_stdarg_start(NODE *f, NODE *a);
395 NODE *powerpc_builtin_va_arg(NODE *f, NODE *a);
396 NODE *powerpc_builtin_va_end(NODE *f, NODE *a);
397 NODE *powerpc_builtin_va_copy(NODE *f, NODE *a);
398 NODE *powerpc_builtin_frame_address(NODE *f, NODE *a);
399 NODE *powerpc_builtin_return_address(NODE *f, NODE *a);
400 #undef NODE
401 
402 #define NARGREGS	8
403 
404 #ifdef ELFABI
405 #define COM     "       # "
406 #else
407 #define COM     "       ; "
408 #endif
409