1 /*	$Id: macdefs.h,v 1.89 2014/06/01 11:35:02 ragge Exp $	*/
2 /*
3  * Copyright (c) 2003 Anders Magnusson (ragge@ludd.luth.se).
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. The name of the author may not be used to endorse or promote products
15  *    derived from this software without specific prior written permission
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 /*
30  * Machine-dependent defines for both passes.
31  */
32 
33 /*
34  * Convert (multi-)character constant to integer.
35  */
36 #define makecc(val,i)	lastcon = (lastcon<<8)|((val<<24)>>24);
37 
38 #define ARGINIT		64	/* # bits above fp where arguments start */
39 #define AUTOINIT	0	/* # bits below fp where automatics start */
40 
41 /*
42  * Storage space requirements
43  */
44 #define SZCHAR		8
45 #define SZBOOL		8
46 #define SZINT		32
47 #define SZFLOAT		32
48 #define SZDOUBLE	64
49 #ifdef MACHOABI
50 #define SZLDOUBLE	128
51 #else
52 #define SZLDOUBLE	96
53 #endif
54 #define SZLONG		32
55 #define SZSHORT		16
56 #define SZLONGLONG	64
57 #define SZPOINT(t)	32
58 
59 /*
60  * Alignment constraints
61  */
62 #define ALCHAR		8
63 #define ALBOOL		8
64 #define ALINT		32
65 #define ALFLOAT		32
66 #define ALDOUBLE	32
67 #ifdef MACHOABI
68 #define ALLDOUBLE	128
69 #else
70 #define ALLDOUBLE	32
71 #endif
72 #define ALLONG		32
73 #define ALLONGLONG	32
74 #define ALSHORT		16
75 #define ALPOINT		32
76 #undef ALSTRUCT		/* Not defined if ELF ABI */
77 #define ALSTACK		32
78 #define	ALMAX		128	/* not yet supported type */
79 
80 /*
81  * Min/max values.
82  */
83 #define	MIN_CHAR	-128
84 #define	MAX_CHAR	127
85 #define	MAX_UCHAR	255
86 #define	MIN_SHORT	-32768
87 #define	MAX_SHORT	32767
88 #define	MAX_USHORT	65535
89 #define	MIN_INT		(-0x7fffffff-1)
90 #define	MAX_INT		0x7fffffff
91 #define	MAX_UNSIGNED	0xffffffff
92 #define	MIN_LONG	MIN_INT
93 #define	MAX_LONG	MAX_INT
94 #define	MAX_ULONG	MAX_UNSIGNED
95 #define	MIN_LONGLONG	0x8000000000000000LL
96 #define	MAX_LONGLONG	0x7fffffffffffffffLL
97 #define	MAX_ULONGLONG	0xffffffffffffffffULL
98 
99 /* Default char is signed */
100 #undef	CHAR_UNSIGNED
101 #define	BOOL_TYPE	UCHAR	/* what used to store _Bool */
102 #undef UNALIGNED_ACCESS
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	STABLBL	".LL%d"		/* format for stab (debugging) labels */
114 #else
115 #define LABFMT	"L%d"		/* format for printing labels */
116 #define	STABLBL	"LL%d"		/* format for stab (debugging) labels */
117 #endif
118 #ifdef LANG_F77
119 #define BLANKCOMMON "_BLNK_"
120 #define MSKIREG  (M(TYSHORT)|M(TYLONG))
121 #define TYIREG TYLONG
122 #define FSZLENG  FSZLONG
123 #define	AUTOREG	EBP
124 #define	ARGREG	EBP
125 #define ARGOFFSET 8
126 #endif
127 
128 #ifdef MACHOABI
129 #define STAB_LINE_ABSOLUTE	/* S_LINE fields use absolute addresses */
130 #define	MYALIGN			/* user power-of-2 alignment */
131 #endif
132 
133 #define BACKAUTO 		/* stack grows negatively for automatics */
134 #define BACKTEMP 		/* stack grows negatively for temporaries */
135 
136 #undef	FIELDOPS		/* no bit-field instructions */
137 #define TARGET_ENDIAN TARGET_LE
138 
139 #define FINDMOPS	/* i386 has instructions that modifies memory */
140 #define	CC_DIV_0	/* division by zero is safe in the compiler */
141 
142 /* Definitions mostly used in pass2 */
143 
144 #define BYTEOFF(x)	((x)&03)
145 #define wdal(k)		(BYTEOFF(k)==0)
146 
147 #define STOARG(p)
148 #define STOFARG(p)
149 #define STOSTARG(p)
150 #define genfcall(a,b)	gencall(a,b)
151 
152 #define	szty(t)	(((t) == DOUBLE || (t) == FLOAT || \
153 	(t) == LONGLONG || (t) == ULONGLONG) ? 2 : (t) == LDOUBLE ? 3 : 1)
154 
155 /*
156  * The x86 has a bunch of register classes, most of them interfering
157  * with each other.  All registers are given a sequential number to
158  * identify it which must match rnames[] in local2.c.
159  * Class membership and overlaps are defined in the macros RSTATUS
160  * and ROVERLAP below.
161  *
162  * The classes used on x86 are:
163  *	A - short and int regs
164  *	B - char regs
165  *	C - long long regs
166  *	D - floating point
167  */
168 #define	EAX	000	/* Scratch and return register */
169 #define	EDX	001	/* Scratch and secondary return register */
170 #define	ECX	002	/* Scratch (and shift count) register */
171 #define	EBX	003	/* GDT pointer or callee-saved temporary register */
172 #define	ESI	004	/* Callee-saved temporary register */
173 #define	EDI	005	/* Callee-saved temporary register */
174 #define	EBP	006	/* Frame pointer */
175 #define	ESP	007	/* Stack pointer */
176 
177 #define	AL	010
178 #define	AH	011
179 #define	DL	012
180 #define	DH	013
181 #define	CL	014
182 #define	CH	015
183 #define	BL	016
184 #define	BH	017
185 
186 #define	EAXEDX	020
187 #define	EAXECX	021
188 #define	EAXEBX	022
189 #define	EAXESI	023
190 #define	EAXEDI	024
191 #define	EDXECX	025
192 #define	EDXEBX	026
193 #define	EDXESI	027
194 #define	EDXEDI	030
195 #define	ECXEBX	031
196 #define	ECXESI	032
197 #define	ECXEDI	033
198 #define	EBXESI	034
199 #define	EBXEDI	035
200 #define	ESIEDI	036
201 
202 /* The 8 math registers in class D lacks names */
203 
204 #define	MAXREGS	047	/* 39 registers */
205 
206 #define	RSTATUS	\
207 	SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|PERMREG,	\
208 	SAREG|PERMREG, SAREG|PERMREG, 0, 0,	 			\
209 	SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG,		\
210 	SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, 	\
211 	SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG,		\
212 	SDREG, SDREG, SDREG, SDREG,  SDREG, SDREG, SDREG, SDREG,
213 
214 #define	ROVERLAP \
215 	/* 8 basic registers */\
216 	{ AL, AH, EAXEDX, EAXECX, EAXEBX, EAXESI, EAXEDI, -1 },\
217 	{ DL, DH, EAXEDX, EDXECX, EDXEBX, EDXESI, EDXEDI, -1 },\
218 	{ CL, CH, EAXECX, EDXECX, ECXEBX, ECXESI, ECXEDI, -1 },\
219 	{ BL, BH, EAXEBX, EDXEBX, ECXEBX, EBXESI, EBXEDI, -1 },\
220 	{ EAXESI, EDXESI, ECXESI, EBXESI, ESIEDI, -1 },\
221 	{ EAXEDI, EDXEDI, ECXEDI, EBXEDI, ESIEDI, -1 },\
222 	{ -1 },\
223 	{ -1 },\
224 \
225 	/* 8 char registers */\
226 	{ EAX, EAXEDX, EAXECX, EAXEBX, EAXESI, EAXEDI, -1 },\
227 	{ EAX, EAXEDX, EAXECX, EAXEBX, EAXESI, EAXEDI, -1 },\
228 	{ EDX, EAXEDX, EDXECX, EDXEBX, EDXESI, EDXEDI, -1 },\
229 	{ EDX, EAXEDX, EDXECX, EDXEBX, EDXESI, EDXEDI, -1 },\
230 	{ ECX, EAXECX, EDXECX, ECXEBX, ECXESI, ECXEDI, -1 },\
231 	{ ECX, EAXECX, EDXECX, ECXEBX, ECXESI, ECXEDI, -1 },\
232 	{ EBX, EAXEBX, EDXEBX, ECXEBX, EBXESI, EBXEDI, -1 },\
233 	{ EBX, EAXEBX, EDXEBX, ECXEBX, EBXESI, EBXEDI, -1 },\
234 \
235 	/* 15 long-long-emulating registers */\
236 	{ EAX, AL, AH, EDX, DL, DH, EAXECX, EAXEBX, EAXESI,	/* eaxedx */\
237 	  EAXEDI, EDXECX, EDXEBX, EDXESI, EDXEDI, -1, },\
238 	{ EAX, AL, AH, ECX, CL, CH, EAXEDX, EAXEBX, EAXESI,	/* eaxecx */\
239 	  EAXEDI, EDXECX, ECXEBX, ECXESI, ECXEDI, -1 },\
240 	{ EAX, AL, AH, EBX, BL, BH, EAXEDX, EAXECX, EAXESI,	/* eaxebx */\
241 	  EAXEDI, EDXEBX, ECXEBX, EBXESI, EBXEDI, -1 },\
242 	{ EAX, AL, AH, ESI, EAXEDX, EAXECX, EAXEBX, EAXEDI,	/* eaxesi */\
243 	  EDXESI, ECXESI, EBXESI, ESIEDI, -1 },\
244 	{ EAX, AL, AH, EDI, EAXEDX, EAXECX, EAXEBX, EAXESI,	/* eaxedi */\
245 	  EDXEDI, ECXEDI, EBXEDI, ESIEDI, -1 },\
246 	{ EDX, DL, DH, ECX, CL, CH, EAXEDX, EAXECX, EDXEBX,	/* edxecx */\
247 	  EDXESI, EDXEDI, ECXEBX, ECXESI, ECXEDI, -1 },\
248 	{ EDX, DL, DH, EBX, BL, BH, EAXEDX, EDXECX, EDXESI,	/* edxebx */\
249 	  EDXEDI, EAXEBX, ECXEBX, EBXESI, EBXEDI, -1 },\
250 	{ EDX, DL, DH, ESI, EAXEDX, EDXECX, EDXEBX, EDXEDI,	/* edxesi */\
251 	  EAXESI, ECXESI, EBXESI, ESIEDI, -1 },\
252 	{ EDX, DL, DH, EDI, EAXEDX, EDXECX, EDXEBX, EDXESI,	/* edxedi */\
253 	  EAXEDI, ECXEDI, EBXEDI, ESIEDI, -1 },\
254 	{ ECX, CL, CH, EBX, BL, BH, EAXECX, EDXECX, ECXESI,	/* ecxebx */\
255 	  ECXEDI, EAXEBX, EDXEBX, EBXESI, EBXEDI, -1 },\
256 	{ ECX, CL, CH, ESI, EAXECX, EDXECX, ECXEBX, ECXEDI,	/* ecxesi */\
257 	  EAXESI, EDXESI, EBXESI, ESIEDI, -1 },\
258 	{ ECX, CL, CH, EDI, EAXECX, EDXECX, ECXEBX, ECXESI,	/* ecxedi */\
259 	  EAXEDI, EDXEDI, EBXEDI, ESIEDI, -1 },\
260 	{ EBX, BL, BH, ESI, EAXEBX, EDXEBX, ECXEBX, EBXEDI,	/* ebxesi */\
261 	  EAXESI, EDXESI, ECXESI, ESIEDI, -1 },\
262 	{ EBX, BL, BH, EDI, EAXEBX, EDXEBX, ECXEBX, EBXESI,	/* ebxedi */\
263 	  EAXEDI, EDXEDI, ECXEDI, ESIEDI, -1 },\
264 	{ ESI, EDI, EAXESI, EDXESI, ECXESI, EBXESI,		/* esiedi */\
265 	  EAXEDI, EDXEDI, ECXEDI, EBXEDI, -1 },\
266 \
267 	/* The fp registers do not overlap with anything */\
268 	{ -1 },\
269 	{ -1 },\
270 	{ -1 },\
271 	{ -1 },\
272 	{ -1 },\
273 	{ -1 },\
274 	{ -1 },\
275 	{ -1 },
276 
277 
278 /* Return a register class based on the type of the node */
279 #define PCLASS(p) (p->n_type <= UCHAR ? SBREG : \
280 		  (p->n_type == LONGLONG || p->n_type == ULONGLONG ? SCREG : \
281 		  (p->n_type >= FLOAT && p->n_type <= LDOUBLE ? SDREG : SAREG)))
282 
283 #define	NUMCLASS 	4	/* highest number of reg classes used */
284 
285 int COLORMAP(int c, int *r);
286 #define	GCLASS(x) (x < 8 ? CLASSA : x < 16 ? CLASSB : x < 31 ? CLASSC : CLASSD)
287 #define DECRA(x,y)	(((x) >> (y*6)) & 63)	/* decode encoded regs */
288 #define	ENCRD(x)	(x)		/* Encode dest reg in n_reg */
289 #define ENCRA1(x)	((x) << 6)	/* A1 */
290 #define ENCRA2(x)	((x) << 12)	/* A2 */
291 #define ENCRA(x,y)	((x) << (6+y*6))	/* encode regs in int */
292 /* XXX - return char in al? */
293 #define	RETREG(x)	(x == CHAR || x == UCHAR ? AL : \
294 			 x == LONGLONG || x == ULONGLONG ? EAXEDX : \
295 			 x == FLOAT || x == DOUBLE || x == LDOUBLE ? 31 : EAX)
296 
297 #if 0
298 #define R2REGS	1	/* permit double indexing */
299 #endif
300 
301 /* XXX - to die */
302 #define FPREG	EBP	/* frame pointer */
303 #define STKREG	ESP	/* stack pointer */
304 
305 #define	SHSTR		(MAXSPECIAL+1)	/* short struct */
306 #define	SFUNCALL	(MAXSPECIAL+2)	/* struct assign after function call */
307 #define	SPCON		(MAXSPECIAL+3)	/* positive nonnamed constant */
308 
309 /*
310  * Specials that indicate the applicability of machine idioms.
311  */
312 #define SMIXOR		(MAXSPECIAL+4)
313 #define SMILWXOR	(MAXSPECIAL+5)
314 #define SMIHWXOR	(MAXSPECIAL+6)
315 
316 /*
317  * i386-specific symbol table flags.
318  */
319 #define	SSECTION	SLOCAL1
320 #define SSTDCALL	SLOCAL2
321 #define SDLLINDIRECT	SLOCAL3
322 
323 /*
324  * i386-specific node flags.
325  */
326 #define FSTDCALL	NLOCAL1
327 #define FFPPOP		NLOCAL2
328 
329 /*
330  * i386-specific interpass stuff.
331  */
332 
333 #define TARGET_IPP_MEMBERS			\
334 	int ipp_argstacksize;
335 
336 #define	HAVE_WEAKREF
337 #define	TARGET_FLT_EVAL_METHOD	2	/* all as long double */
338 
339 /*
340  * Extended assembler macros.
341  */
342 void targarg(char *w, void *arg);
343 #define	XASM_TARGARG(w, ary)	\
344 	(w[1] == 'b' || w[1] == 'h' || w[1] == 'w' || w[1] == 'k' ? \
345 	w++, targarg(w, ary), 1 : 0)
346 int numconv(void *ip, void *p, void *q);
347 #define	XASM_NUMCONV(ip, p, q)	numconv(ip, p, q)
348 int xasmconstregs(char *);
349 #define	XASMCONSTREGS(x) xasmconstregs(x)
350 #define	MYSETXARG if (XASMVAL(cw) == 'q') {	\
351 	c = 'r'; addalledges(&ablock[ESI]); addalledges(&ablock[EDI]); }
352 
353 #if defined(MACHOABI)
354 struct stub {
355 	struct { struct stub *q_forw, *q_back; } link;
356 	char *name;
357 };
358 extern struct stub stublist;
359 extern struct stub nlplist;
360 void addstub(struct stub *list, char *name);
361 #endif
362