Quick Search:

View

Revision:
Expand:  
Changeset: MAIN:ragge:20110623134125

Diff

Diff from 1.83 to:

Annotations

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

Annotated File View

ragge
1.83
1 /*      $Id: macdefs.h,v 1.83 2011/06/23 13:41:25 ragge Exp $   */
ragge
1.1
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  */
ragge
1.2
36 #define makecc(val,i)   lastcon = (lastcon<<8)|((val<<24)>>24);
ragge
1.1
37
38 #define ARGINIT         64      /* # bits above fp where arguments start */
ragge
1.2
39 #define AUTOINIT        0       /* # bits below fp where automatics start */
ragge
1.1
40
41 /*
42  * Storage space requirements
43  */
44 #define SZCHAR          8
ragge
1.45
45 #define SZBOOL          8
ragge
1.1
46 #define SZINT           32
47 #define SZFLOAT         32
48 #define SZDOUBLE        64
gmcgarry
1.70
49 #ifdef MACHOABI
50 #define SZLDOUBLE       128
51 #else
ragge
1.8
52 #define SZLDOUBLE       96
gmcgarry
1.70
53 #endif
ragge
1.1
54 #define SZLONG          32
55 #define SZSHORT         16
56 #define SZLONGLONG      64
ragge
1.13
57 #define SZPOINT(t)      32
ragge
1.1
58
59 /*
60  * Alignment constraints
61  */
62 #define ALCHAR          8
ragge
1.45
63 #define ALBOOL          8
ragge
1.1
64 #define ALINT           32
65 #define ALFLOAT         32
66 #define ALDOUBLE        32
gmcgarry
1.70
67 #ifdef MACHOABI
68 #define ALLDOUBLE       128
69 #else
ragge
1.8
70 #define ALLDOUBLE       32
gmcgarry
1.70
71 #endif
ragge
1.1
72 #define ALLONG          32
73 #define ALLONGLONG      32
74 #define ALSHORT         16
75 #define ALPOINT         32
ragge
1.64
76 #undef ALSTRUCT         /* Not defined if ELF ABI */
ragge
1.1
77 #define ALSTACK         32 
ragge
1.66
78 #define ALMAX           128     /* not yet supported type */
ragge
1.1
79
80 /*
ragge
1.10
81  * Min/max values.
ragge
1.1
82  */
ragge
1.11
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
ragge
1.48
89 #define MIN_INT         (-0x7fffffff-1)
ragge
1.1
90 #define MAX_INT         0x7fffffff
91 #define MAX_UNSIGNED    0xffffffff
ragge
1.11
92 #define MIN_LONG        MIN_INT
ragge
1.1
93 #define MAX_LONG        MAX_INT
94 #define MAX_ULONG       MAX_UNSIGNED
ragge
1.10
95 #define MIN_LONGLONG    0x8000000000000000LL
ragge
1.1
96 #define MAX_LONGLONG    0x7fffffffffffffffLL
97 #define MAX_ULONGLONG   0xffffffffffffffffULL
98
ragge
1.36
99 /* Default char is signed */
ragge
1.1
100 #undef  CHAR_UNSIGNED
ragge
1.78
101 #define BOOL_TYPE       UCHAR   /* what used to store _Bool */
ragge
1.1
102
103 /*
ragge
1.7
104  * Use large-enough types.
ragge
1.1
105  */
106 typedef long long CONSZ;
107 typedef unsigned long long U_CONSZ;
108 typedef long long OFFSZ;
109
ragge
1.2
110 #define CONFMT  "%lld"          /* format for printing constants */
gmcgarry
1.60
111 #if defined(ELFABI)
ragge
1.2
112 #define LABFMT  ".L%d"          /* format for printing labels */
ragge
1.10
113 #define STABLBL ".LL%d"         /* format for stab (debugging) labels */
gmcgarry
1.60
114 #else
115 #define LABFMT  "L%d"           /* format for printing labels */
116 #define STABLBL "LL%d"          /* format for stab (debugging) labels */
117 #endif
ragge
1.52
118 #ifdef LANG_F77
ragge
1.16
119 #define BLANKCOMMON "_BLNK_"
ragge
1.17
120 #define MSKIREG  (M(TYSHORT)|M(TYLONG))
121 #define TYIREG TYLONG
122 #define FSZLENG  FSZLONG
123 #define AUTOREG EBP
124 #define ARGREG  EBP
ragge
1.56
125 #define ARGOFFSET 8
ragge
1.15
126 #endif
ragge
1.1
127
gmcgarry
1.60
128 #ifdef MACHOABI
129 #define STAB_LINE_ABSOLUTE      /* S_LINE fields use absolute addresses */
ragge
1.82
130 #define MYALIGN                 /* user power-of-2 alignment */
gmcgarry
1.60
131 #endif
132
ragge
1.1
133 #define BACKAUTO                /* stack grows negatively for automatics */
134 #define BACKTEMP                /* stack grows negatively for temporaries */
135
136 #undef  FIELDOPS                /* no bit-field instructions */
ragge
1.80
137 #define TARGET_ENDIAN TARGET_LE
ragge
1.1
138
ragge
1.65
139 #define FINDMOPS        /* i386 has instructions that modifies memory */
ragge
1.76
140 #define CC_DIV_0        /* division by zero is safe in the compiler */
ragge
1.65
141
ragge
1.1
142 /* Definitions mostly used in pass2 */
143
144 #define BYTEOFF(x)      ((x)&03)
145 #define wdal(k)         (BYTEOFF(k)==0)
ragge
1.41
146 #define BITOOR(x)       (x)     /* bit offset to oreg offset XXX die! */
ragge
1.1
147
148 #define STOARG(p)
149 #define STOFARG(p)
150 #define STOSTARG(p)
151 #define genfcall(a,b)   gencall(a,b)
152
153 #define szty(t) (((t) == DOUBLE || (t) == FLOAT || \
ragge
1.44
154         (t) == LONGLONG || (t) == ULONGLONG) ? 2 : (t) == LDOUBLE ? 3 : 1)
ragge
1.1
155
ragge
1.22
156 /*
157  * The x86 has a bunch of register classes, most of them interfering
ragge
1.36
158  * with each other.  All registers are given a sequential number to
159  * identify it which must match rnames[] in local2.c.
160  * Class membership and overlaps are defined in the macros RSTATUS
161  * and ROVERLAP below.
ragge
1.34
162  *
163  * The classes used on x86 are:
164  *      A - short and int regs
165  *      B - char regs
166  *      C - long long regs
167  *      D - floating point
168  */
169 #define EAX     000     /* Scratch and return register */
170 #define EDX     001     /* Scratch and secondary return register */
171 #define ECX     002     /* Scratch (and shift count) register */
172 #define EBX     003     /* GDT pointer or callee-saved temporary register */
173 #define ESI     004     /* Callee-saved temporary register */
174 #define EDI     005     /* Callee-saved temporary register */
175 #define EBP     006     /* Frame pointer */
176 #define ESP     007     /* Stack pointer */
177
178 #define AL      010
179 #define AH      011
180 #define DL      012
181 #define DH      013
182 #define CL      014
183 #define CH      015
184 #define BL      016
185 #define BH      017
186
187 #define EAXEDX  020
188 #define EAXECX  021
189 #define EAXEBX  022
190 #define EAXESI  023
191 #define EAXEDI  024
192 #define EDXECX  025
193 #define EDXEBX  026
194 #define EDXESI  027
195 #define EDXEDI  030
196 #define ECXEBX  031
197 #define ECXESI  032
198 #define ECXEDI  033
199 #define EBXESI  034
200 #define EBXEDI  035
201 #define ESIEDI  036
202
203 /* The 8 math registers in class D lacks names */
204
ragge
1.36
205 #define MAXREGS 047     /* 39 registers */
ragge
1.34
206
207 #define RSTATUS \
208         SAREG|TEMPREGSAREG|TEMPREGSAREG|TEMPREGSAREG|PERMREG,     \
ragge
1.37
209         SAREG|PERMREGSAREG|PERMREG00,                             \
ragge
1.34
210         SBREGSBREGSBREGSBREGSBREGSBREGSBREGSBREG,         \
211         SCREGSCREGSCREGSCREGSCREGSCREGSCREGSCREG,         \
212         SCREGSCREGSCREGSCREGSCREGSCREGSCREG,                \
ragge
1.44
213         SDREGSDREGSDREGSDREG,  SDREGSDREGSDREGSDREG,
ragge
1.34
214
215 #define ROVERLAP \
216         /* 8 basic registers */\
217         { ALAHEAXEDXEAXECXEAXEBXEAXESIEAXEDI, -1 },\
218         { DLDHEAXEDXEDXECXEDXEBXEDXESIEDXEDI, -1 },\
219         { CLCHEAXECXEDXECXECXEBXECXESIECXEDI, -1 },\
220         { BLBHEAXEBXEDXEBXECXEBXEBXESIEBXEDI, -1 },\
221         { EAXESIEDXESIECXESIEBXESIESIEDI, -1 },\
222         { EAXEDIEDXEDIECXEDIEBXEDIESIEDI, -1 },\
223         { -1 },\
224         { -1 },\
225 \
226         /* 8 char registers */\
227         { EAXEAXEDXEAXECXEAXEBXEAXESIEAXEDI, -1 },\
228         { EAXEAXEDXEAXECXEAXEBXEAXESIEAXEDI, -1 },\
229         { EDXEAXEDXEDXECXEDXEBXEDXESIEDXEDI, -1 },\
230         { EDXEAXEDXEDXECXEDXEBXEDXESIEDXEDI, -1 },\
231         { ECXEAXECXEDXECXECXEBXECXESIECXEDI, -1 },\
232         { ECXEAXECXEDXECXECXEBXECXESIECXEDI, -1 },\
233         { EBXEAXEBXEDXEBXECXEBXEBXESIEBXEDI, -1 },\
234         { EBXEAXEBXEDXEBXECXEBXEBXESIEBXEDI, -1 },\
235 \
236         /* 15 long-long-emulating registers */\
237         { EAXALAHEDXDLDHEAXECXEAXEBXEAXESI,     /* eaxedx */\
238           EAXEDIEDXECXEDXEBXEDXESIEDXEDI, -1, },\
239         { EAXALAHECXCLCHEAXEDXEAXEBXEAXESI,     /* eaxecx */\
240           EAXEDIEDXECXECXEBXECXESIECXEDI, -1 },\
241         { EAXALAHEBXBLBHEAXEDXEAXECXEAXESI,     /* eaxebx */\
242           EAXEDIEDXEBXECXEBXEBXESIEBXEDI, -1 },\
243         { EAXALAHESIEAXEDXEAXECXEAXEBXEAXEDI,     /* eaxesi */\
244           EDXESIECXESIEBXESIESIEDI, -1 },\
245         { EAXALAHEDIEAXEDXEAXECXEAXEBXEAXESI,     /* eaxedi */\
246           EDXEDIECXEDIEBXEDIESIEDI, -1 },\
247         { EDXDLDHECXCLCHEAXEDXEAXECXEDXEBX,     /* edxecx */\
248           EDXESIEDXEDIECXEBXECXESIECXEDI, -1 },\
249         { EDXDLDHEBXBLBHEAXEDXEDXECXEDXESI,     /* edxebx */\
250           EDXEDIEAXEBXECXEBXEBXESIEBXEDI, -1 },\
251         { EDXDLDHESIEAXEDXEDXECXEDXEBXEDXEDI,     /* edxesi */\
252           EAXESIECXESIEBXESIESIEDI, -1 },\
253         { EDXDLDHEDIEAXEDXEDXECXEDXEBXEDXESI,     /* edxedi */\
254           EAXEDIECXEDIEBXEDIESIEDI, -1 },\
255         { ECXCLCHEBXBLBHEAXECXEDXECXECXESI,     /* ecxebx */\
256           ECXEDIEAXEBXEDXEBXEBXESIEBXEDI, -1 },\
257         { ECXCLCHESIEAXECXEDXECXECXEBXECXEDI,     /* ecxesi */\
258           EAXESIEDXESIEBXESIESIEDI, -1 },\
259         { ECXCLCHEDIEAXECXEDXECXECXEBXECXESI,     /* ecxedi */\
260           EAXEDIEDXEDIEBXEDIESIEDI, -1 },\
ragge
1.40
261         { EBXBLBHESIEAXEBXEDXEBXECXEBXEBXEDI,     /* ebxesi */\
ragge
1.34
262           EAXESIEDXESIECXESIESIEDI, -1 },\
ragge
1.40
263         { EBXBLBHEDIEAXEBXEDXEBXECXEBXEBXESI,     /* ebxedi */\
ragge
1.34
264           EAXEDIEDXEDIECXEDIESIEDI, -1 },\
265         { ESIEDIEAXESIEDXESIECXESIEBXESI,             /* esiedi */\
266           EAXEDIEDXEDIECXEDIEBXEDI, -1 },\
267 \
268         /* The fp registers do not overlap with anything */\
269         { -1 },\
270         { -1 },\
271         { -1 },\
272         { -1 },\
273         { -1 },\
274         { -1 },\
275         { -1 },\
276         { -1 },
277
ragge
1.22
278
ragge
1.43
279 /* Return a register class based on the type of the node */
ragge
1.34
280 #define PCLASS(p) (p->n_type <= UCHAR ? SBREG : \
ragge
1.23
281                   (p->n_type == LONGLONG || p->n_type == ULONGLONG ? SCREG : \
282                   (p->n_type >= FLOAT && p->n_type <= LDOUBLE ? SDREG : SAREG)))
283
ragge
1.24
284 #define NUMCLASS        4       /* highest number of reg classes used */
ragge
1.22
285
ragge
1.28
286 int COLORMAP(int cint *r);
ragge
1.30
287 #define GCLASS(x) (x < 8 ? CLASSA : x < 16 ? CLASSB : x < 31 ? CLASSC : CLASSD)
ragge
1.39
288 #define DECRA(x,y)      (((x) >> (y*6)) & 63)   /* decode encoded regs */
ragge
1.26
289 #define ENCRD(x)        (x)             /* Encode dest reg in n_reg */
290 #define ENCRA1(x)       ((x) << 6)      /* A1 */
ragge
1.36
291 #define ENCRA2(x)       ((x) << 12)     /* A2 */
ragge
1.39
292 #define ENCRA(x,y)      ((x) << (6+y*6))        /* encode regs in int */
ragge
1.46
293 /* XXX - return char in al? */
ragge
1.37
294 #define RETREG(x)       (x == CHAR || x == UCHAR ? AL : \
295                          x == LONGLONG || x == ULONGLONG ? EAXEDX : \
ragge
1.39
296                          x == FLOAT || x == DOUBLE || x == LDOUBLE ? 31 : EAX)
ragge
1.25
297
gmcgarry
1.68
298 #if 0
299 #define R2REGS  1       /* permit double indexing */
300 #endif
ragge
1.42
301
ragge
1.22
302 /* XXX - to die */
ragge
1.7
303 #define FPREG   EBP     /* frame pointer */
304 #define STKREG  ESP     /* stack pointer */
ragge
1.1
305
ragge
1.41
306 #define SHSTR           (MAXSPECIAL+1)  /* short struct */
307 #define SFUNCALL        (MAXSPECIAL+2)  /* struct assign after function call */
ragge
1.42
308 #define SPCON           (MAXSPECIAL+3)  /* positive nonnamed constant */
stefan
1.49
309
310 /*
311  * Specials that indicate the applicability of machine idioms.
312  */
313 #define SMIXOR          (MAXSPECIAL+4)
314 #define SMILWXOR        (MAXSPECIAL+5)
315 #define SMIHWXOR        (MAXSPECIAL+6)
ragge
1.51
316
317 /*
318  * i386-specific symbol table flags.
319  */
320 #define SSECTION        SLOCAL1
gmcgarry
1.63
321 #define SSTDCALL        SLOCAL2 
322 #define SDLLINDIRECT    SLOCAL3
323
324 /*
325  * i386-specific node flags.
326  */
ragge
1.72
327 #define FSTDCALL        NLOCAL1
328 #define FFPPOP          NLOCAL2
gmcgarry
1.63
329
330 /*
331  * i386-specific interpass stuff.
332  */
333
334 #define TARGET_IPP_MEMBERS                      \
335         int ipp_argstacksize;
gmcgarry
1.57
336
ragge
1.58
337 /*
338  * Extended assembler macros.
339  */
340 void targarg(char *wvoid *arg);
341 #define XASM_TARGARG(w, ary)    \
ragge
1.61
342         (w[1] == 'b' || w[1] == 'h' || w[1] == 'w' || w[1] == 'k' ? \
ragge
1.59
343         w++, targarg(wary), 1 : 0)
ragge
1.62
344 int numconv(void *ipvoid *pvoid *q);
345 #define XASM_NUMCONV(ip, p, q)  numconv(ip, p, q)
ragge
1.67
346 int xasmconstregs(char *);
347 #define XASMCONSTREGS(x) xasmconstregs(x)
ragge
1.75
348 #define MYSETXARG if (XASMVAL(cw) == 'q') {     \
ragge
1.77
349         c = 'r'addalledges(&ablock[ESI]); addalledges(&ablock[EDI]); }
ragge
1.58
350
351 /*
352  * builtins.
353  */
gmcgarry
1.57
354 #define TARGET_BUILTINS                                                 \
ragge
1.73
355         { "__builtin_frame_address"i386_builtin_frame_address, -1 },  \
356         { "__builtin_return_address"i386_builtin_return_address, -1 },
gmcgarry
1.57
357
358 #define NODE struct node
359 struct node;
ragge
1.74
360 NODE *i386_builtin_frame_address(NODE *fNODE *aunsigned int);
361 NODE *i386_builtin_return_address(NODE *fNODE *aunsigned int);
gmcgarry
1.57
362 #undef NODE
gmcgarry
1.60
363
364 #if defined(MACHOABI)
365 struct stub {
366         struct { struct stub *q_forw, *q_back; } link;
367         char *name;
368 };    
369 extern struct stub stublist;
370 extern struct stub nlplist;
371 void addstub(struct stub *listchar *name);
372 #endif
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-09-22 04:15 +0200