Quick Search:

View

Revision:
Expand:  
Changeset: MAIN:mickey:20090120121658

Diff

Diff from 1.3 to:

Annotations

Annotate by Age | Author | Mixed | None
/fisheye/browse/pcc/pcc/arch/amd64/macdefs.h

Annotated File View

mickey
1.3
1 /*      $Id: macdefs.h,v 1.3 2009/01/20 12:16:58 mickey Exp $   */
mickey
1.1
2 /*
3  * Copyright (c) 2008 Michael Shalayeff
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 #define ARGINIT         64      /* # bits above fp where arguments start */
40 #define AUTOINIT        0       /* # bits below fp where automatics start */
41
42 /*
43  * Storage space requirements
44  */
45 #define SZCHAR          8
46 #define SZBOOL          8
47 #define SZSHORT         16
48 #define SZINT           32
49 #define SZLONG          64
50 #define SZPOINT(t)      64
51 #define SZLONGLONG      64
52 #define SZFLOAT         32
53 #define SZDOUBLE        64
54 #define SZLDOUBLE       128
55
56 /*
57  * Alignment constraints
58  */
59 #define ALCHAR          8
60 #define ALBOOL          8
61 #define ALSHORT         16
62 #define ALINT           32
63 #define ALLONG          64
64 #define ALPOINT         64
65 #define ALLONGLONG      64
66 #define ALFLOAT         32
67 #define ALDOUBLE        64
68 #define ALLDOUBLE       128
69 #define ALSTRUCT        128
mickey
1.2
70 #define ALSTACK         64
71 #define ALMAX           128 
mickey
1.1
72
73 /*
74  * Min/max values.
75  */
76 #define MIN_CHAR        -128
77 #define MAX_CHAR        127
78 #define MAX_UCHAR       255
79 #define MIN_SHORT       -32768
80 #define MAX_SHORT       32767
81 #define MAX_USHORT      65535
82 #define MIN_INT         (-0x7fffffff-1)
83 #define MAX_INT         0x7fffffff
84 #define MAX_UNSIGNED    0xffffffff
85 #define MIN_LONG        MIN_LONGLONG
86 #define MAX_LONG        MAX_LONGLONG
87 #define MAX_ULONG       MAX_ULONGLONG
88 #define MIN_LONGLONG    0x8000000000000000LL
89 #define MAX_LONGLONG    0x7fffffffffffffffLL
90 #define MAX_ULONGLONG   0xffffffffffffffffULL
91
92 /* Default char is signed */
93 #undef  CHAR_UNSIGNED
94 #define BOOL_TYPE       CHAR    /* what used to store _Bool */
95 #if defined(os_mirbsd) || defined(os_win32)
96 #define WCHAR_TYPE      USHORT  /* ISO 10646 16-bit Unicode */
97 #else
98 #define WCHAR_TYPE      INT     /* what used to store wchar_t */
99 #endif
100
101 /*
102  * Use large-enough types.
103  */
104 typedef long long CONSZ;
105 typedef unsigned long long U_CONSZ;
106 typedef long long OFFSZ;
107
108 #define CONFMT  "%lld"          /* format for printing constants */
109 #define LABFMT  ".L%d"          /* format for printing labels */
110 #define STABLBL ".LL%d"         /* format for stab (debugging) labels */
111 #ifdef LANG_F77
112 #define BLANKCOMMON "_BLNK_"
113 #define MSKIREG  (M(TYSHORT)|M(TYLONG))
114 #define TYIREG TYLONG
115 #define FSZLENG  FSZLONG
116 #define AUTOREG EBP
117 #define ARGREG  EBP
118 #define ARGOFFSET 8
119 #endif
120
121 #define BACKAUTO                /* stack grows negatively for automatics */
122 #define BACKTEMP                /* stack grows negatively for temporaries */
123
124 #undef  FIELDOPS                /* no bit-field instructions */
125 #define RTOLBYTES               /* bytes are numbered right to left */
126
127 #define ENUMSIZE(high,low) INT  /* enums are always stored in full int */
128
129 #define FINDMOPS        /* i386 has instructions that modifies memory */
130
131 /* Definitions mostly used in pass2 */
132
133 #define BYTEOFF(x)      ((x)&03)
134 #define wdal(k)         (BYTEOFF(k)==0)
135 #define BITOOR(x)       (x)     /* bit offset to oreg offset XXX die! */
136
137 #define STOARG(p)
138 #define STOFARG(p)
139 #define STOSTARG(p)
140 #define genfcall(a,b)   gencall(a,b)
141
142 #define szty(t) (((t) == DOUBLE || (t) == FLOAT || (t) == LONG || \
143         (t) == ULONG || (t) == LONGLONG || (t) == ULONGLONG) ? 2 : \
144         (t) == LDOUBLE ? 4 : 1)
145
146 /*
147  * The x86 has a bunch of register classes, most of them interfering
148  * with each other.  All registers are given a sequential number to
149  * identify it which must match rnames[] in local2.c.
150  * Class membership and overlaps are defined in the macros RSTATUS
151  * and ROVERLAP below.
152  *
153  * The classes used on x86 are:
154  *      A - short and int regs
155  *      B - char regs
156  *      C - long long regs
157  *      D - floating point
158  */
159 #define EAX     000     /* Scratch and return register */
160 #define EDX     001     /* Scratch and secondary return register */
161 #define ECX     002     /* Scratch (and shift count) register */
162 #define EBX     003     /* GDT pointer or callee-saved temporary register */
163 #define ESI     004     /* Callee-saved temporary register */
164 #define EDI     005     /* Callee-saved temporary register */
165 #define EBP     006     /* Frame pointer */
166 #define ESP     007     /* Stack pointer */
167
168 #define AL      010
169 #define AH      011
170 #define DL      012
171 #define DH      013
172 #define CL      014
173 #define CH      015
174 #define BL      016
175 #define BH      017
176
177 #define RAX     020
178 #define RDX     021
179 #define RCX     022
180 #define RBX     023
181 #define RSI     024
182 #define RDI     025
183 #define RBP     026
184 #define RSP     027
185 #define R08     030
186 #define R09     031
187 #define R10     032
188 #define R11     033
189 #define R12     034
190 #define R13     035
191 #define R14     036
192 #define R15     037
193
mickey
1.3
194 #define EAXEDX  040
195
mickey
1.1
196 /* The 8 math registers in class D lacks names */
197
mickey
1.3
198 #define MAXREGS 051     /* 41 registers */
mickey
1.1
199
200 #define RSTATUS \
201         SAREG|TEMPREGSAREG|TEMPREGSAREG|TEMPREGSAREG|PERMREG,     \
202         SAREG|TEMPREGSAREG|TEMPREG00,                             \
203         SBREGSBREGSBREGSBREGSBREGSBREGSBREGSBREG,         \
204         SCREGSCREGSCREGSCREGSCREGSCREG00,                 \
205         SCREG|TEMPREGSCREG|TEMPREGSCREG|TEMPREGSCREG|TEMPREG,     \
206         SCREG|PERMREGSCREG|PERMREGSCREG|PERMREGSCREG|PERMREG,     \
mickey
1.3
207         SCREG,                                                          \
mickey
1.1
208         SDREGSDREGSDREGSDREG,  SDREGSDREGSDREGSDREG,
209
210 #define ROVERLAP \
211         /* 8 basic registers */\
mickey
1.3
212         { ALAHRAXEAXEDX, -1 },\
213         { DLDHRDXEAXEDX, -1 },\
mickey
1.1
214         { CLCHRCX, -1 },\
215         { BLBHRBX, -1 },\
216         { RSI, -1 },\
217         { RDI, -1 },\
218         { RBP, -1 },\
219         { RSP, -1 },\
220 \
221         /* 8 char registers */\
mickey
1.3
222         { EAXRAXEAXEDX, -1 },\
223         { EAXRAXEAXEDX, -1 },\
224         { EDXRDXEAXEDX, -1 },\
225         { EDXRDXEAXEDX, -1 },\
mickey
1.1
226         { ECXRCX, -1 },\
227         { ECXRCX, -1 },\
228         { EBXRBX, -1 },\
229         { EBXRBX, -1 },\
230 \
mickey
1.3
231         /* 16 long-long registers */\
232         { EAXALAHEAXEDX, -1 },\
233         { EDXDLDHEAXEDX, -1 },\
mickey
1.1
234         { ECXCLCH, -1 },\
235         { EBXBLBH, -1 },\
236         { ESI, -1 },\
237         { EDI, -1 },\
238         { EBP, -1 },\
239         { ESP, -1 },\
240         { -1 },\
241         { -1 },\
242         { -1 },\
243         { -1 },\
244         { -1 },\
245         { -1 },\
246         { -1 },\
247         { -1 },\
mickey
1.3
248         { ALAHDLDHEAXEDXRAXRDX },\
mickey
1.1
249 \
250         /* The fp registers do not overlap with anything */\
251         { -1 },\
252         { -1 },\
253         { -1 },\
254         { -1 },\
255         { -1 },\
256         { -1 },\
257         { -1 },\
258         { -1 },
259
260
261 /* Return a register class based on the type of the node */
262 #define PCLASS(p) (p->n_type <= UCHAR ? SBREG : \
263                   (p->n_type == LONG || p->n_type == ULONG || \
264                    p->n_type == LONGLONG || p->n_type == ULONGLONG ? SCREG : \
265                   (p->n_type >= FLOAT && p->n_type <= LDOUBLE ? SDREG : SAREG)))
266
267 #define NUMCLASS        4       /* highest number of reg classes used */
268
269 int COLORMAP(int cint *r);
270 #define GCLASS(x) (x < 8 ? CLASSA : x < 16 ? CLASSB : x < 32 ? CLASSC : CLASSD)
271 #define DECRA(x,y)      (((x) >> (y*8)) & 255)  /* decode encoded regs */
272 #define ENCRD(x)        (x)             /* Encode dest reg in n_reg */
273 #define ENCRA1(x)       ((x) << 8)      /* A1 */
274 #define ENCRA2(x)       ((x) << 16)     /* A2 */
275 #define ENCRA(x,y)      ((x) << (8+y*8))        /* encode regs in int */
276 /* XXX - return char in al? */
277 #define RETREG(x)       (x == CHAR || x == UCHAR ? AL : \
278                          x == LONG || x == ULONG || \
279                          x == LONGLONG || x == ULONGLONG ? RAX : \
280                          x == FLOAT || x == DOUBLE || x == LDOUBLE ? 32 : EAX)
281
282 //#define R2REGS        1       /* permit double indexing */
283
284 /* XXX - to die */
285 #define FPREG   RBP     /* frame pointer */
286 #define STKREG  RSP     /* stack pointer */
287
288 #define SHSTR           (MAXSPECIAL+1)  /* short struct */
289 #define SFUNCALL        (MAXSPECIAL+2)  /* struct assign after function call */
290 #define SPCON           (MAXSPECIAL+3)  /* positive nonnamed constant */
291
292 /*
293  * Specials that indicate the applicability of machine idioms.
294  */
295 #define SMIXOR          (MAXSPECIAL+4)
296 #define SMILWXOR        (MAXSPECIAL+5)
297 #define SMIHWXOR        (MAXSPECIAL+6)
298
299 /*
300  * i386-specific symbol table flags.
301  */
302 #define SSECTION        SLOCAL1
303 #define STLS            SLOCAL2
304 #define SNOUNDERSCORE   SLOCAL3
305 #define SSTDCALL        SLOCAL2 
306 #define SDLLINDIRECT    SLOCAL3
307
308 /*
309  * i386-specific node flags.
310  */
311 #define FSTDCALL        0x01
312
313 /*
314  * i386-specific interpass stuff.
315  */
316
317 #define TARGET_IPP_MEMBERS                      \
318         int ipp_argstacksize;
319
320 /*
321  * Extended assembler macros.
322  */
323 void targarg(char *wvoid *arg);
324 #define XASM_TARGARG(w, ary)    \
325         (w[1] == 'b' || w[1] == 'h' || w[1] == 'w' || w[1] == 'k' ? \
326         w++, targarg(wary), 1 : 0)
327 int numconv(void *ipvoid *pvoid *q);
328 #define XASM_NUMCONV(ip, p, q)  numconv(ip, p, q)
329
330 /*
331  * builtins.
332  */
333 #define TARGET_BUILTINS                                                 \
334         { "__builtin_frame_address"i386_builtin_frame_address },      \
335         { "__builtin_return_address"i386_builtin_return_address },
336
337 #define NODE struct node
338 struct node;
339 NODE *i386_builtin_frame_address(NODE *fNODE *a);
340 NODE *i386_builtin_return_address(NODE *fNODE *a);
341 #undef NODE
FishEye: Open Source License registered to PCC.
Your maintenance has expired. You can renew your license at http://www.atlassian.com/fisheye/renew
Atlassian FishEye, CVS analysis. (Version:1.6.3 Build:build-336 2008-11-04) - Administration - Page generated 2014-10-01 20:18 +0200