Quick Search:

View

Revision:
Expand:  
Changeset: MAIN:ragge:20140601113502

Diff

Diff from 1.89 to:

Annotations

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

Annotated File View

ragge
1.89
1 /*      $Id: macdefs.h,v 1.89 2014/06/01 11:35:02 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.84
102 #undef UNALIGNED_ACCESS
ragge
1.1
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)
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 || \
ragge
1.44
153         (t) == LONGLONG || (t) == ULONGLONG) ? 2 : (t) == LDOUBLE ? 3 : 1)
ragge
1.1
154
ragge
1.22
155 /*
156  * The x86 has a bunch of register classes, most of them interfering
ragge
1.36
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.
ragge
1.34
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
ragge
1.36
204 #define MAXREGS 047     /* 39 registers */
ragge
1.34
205
206 #define RSTATUS \
207         SAREG|TEMPREGSAREG|TEMPREGSAREG|TEMPREGSAREG|PERMREG,     \
ragge
1.37
208         SAREG|PERMREGSAREG|PERMREG00,                             \
ragge
1.34
209         SBREGSBREGSBREGSBREGSBREGSBREGSBREGSBREG,         \
210         SCREGSCREGSCREGSCREGSCREGSCREGSCREGSCREG,         \
211         SCREGSCREGSCREGSCREGSCREGSCREGSCREG,                \
ragge
1.44
212         SDREGSDREGSDREGSDREG,  SDREGSDREGSDREGSDREG,
ragge
1.34
213
214 #define ROVERLAP \
215         /* 8 basic registers */\
216         { ALAHEAXEDXEAXECXEAXEBXEAXESIEAXEDI, -1 },\
217         { DLDHEAXEDXEDXECXEDXEBXEDXESIEDXEDI, -1 },\
218         { CLCHEAXECXEDXECXECXEBXECXESIECXEDI, -1 },\
219         { BLBHEAXEBXEDXEBXECXEBXEBXESIEBXEDI, -1 },\
220         { EAXESIEDXESIECXESIEBXESIESIEDI, -1 },\
221         { EAXEDIEDXEDIECXEDIEBXEDIESIEDI, -1 },\
222         { -1 },\
223         { -1 },\
224 \
225         /* 8 char registers */\
226         { EAXEAXEDXEAXECXEAXEBXEAXESIEAXEDI, -1 },\
227         { EAXEAXEDXEAXECXEAXEBXEAXESIEAXEDI, -1 },\
228         { EDXEAXEDXEDXECXEDXEBXEDXESIEDXEDI, -1 },\
229         { EDXEAXEDXEDXECXEDXEBXEDXESIEDXEDI, -1 },\
230         { ECXEAXECXEDXECXECXEBXECXESIECXEDI, -1 },\
231         { ECXEAXECXEDXECXECXEBXECXESIECXEDI, -1 },\
232         { EBXEAXEBXEDXEBXECXEBXEBXESIEBXEDI, -1 },\
233         { EBXEAXEBXEDXEBXECXEBXEBXESIEBXEDI, -1 },\
234 \
235         /* 15 long-long-emulating registers */\
236         { EAXALAHEDXDLDHEAXECXEAXEBXEAXESI,     /* eaxedx */\
237           EAXEDIEDXECXEDXEBXEDXESIEDXEDI, -1, },\
238         { EAXALAHECXCLCHEAXEDXEAXEBXEAXESI,     /* eaxecx */\
239           EAXEDIEDXECXECXEBXECXESIECXEDI, -1 },\
240         { EAXALAHEBXBLBHEAXEDXEAXECXEAXESI,     /* eaxebx */\
241           EAXEDIEDXEBXECXEBXEBXESIEBXEDI, -1 },\
242         { EAXALAHESIEAXEDXEAXECXEAXEBXEAXEDI,     /* eaxesi */\
243           EDXESIECXESIEBXESIESIEDI, -1 },\
244         { EAXALAHEDIEAXEDXEAXECXEAXEBXEAXESI,     /* eaxedi */\
245           EDXEDIECXEDIEBXEDIESIEDI, -1 },\
246         { EDXDLDHECXCLCHEAXEDXEAXECXEDXEBX,     /* edxecx */\
247           EDXESIEDXEDIECXEBXECXESIECXEDI, -1 },\
248         { EDXDLDHEBXBLBHEAXEDXEDXECXEDXESI,     /* edxebx */\
249           EDXEDIEAXEBXECXEBXEBXESIEBXEDI, -1 },\
250         { EDXDLDHESIEAXEDXEDXECXEDXEBXEDXEDI,     /* edxesi */\
251           EAXESIECXESIEBXESIESIEDI, -1 },\
252         { EDXDLDHEDIEAXEDXEDXECXEDXEBXEDXESI,     /* edxedi */\
253           EAXEDIECXEDIEBXEDIESIEDI, -1 },\
254         { ECXCLCHEBXBLBHEAXECXEDXECXECXESI,     /* ecxebx */\
255           ECXEDIEAXEBXEDXEBXEBXESIEBXEDI, -1 },\
256         { ECXCLCHESIEAXECXEDXECXECXEBXECXEDI,     /* ecxesi */\
257           EAXESIEDXESIEBXESIESIEDI, -1 },\
258         { ECXCLCHEDIEAXECXEDXECXECXEBXECXESI,     /* ecxedi */\
259           EAXEDIEDXEDIEBXEDIESIEDI, -1 },\
ragge
1.40
260         { EBXBLBHESIEAXEBXEDXEBXECXEBXEBXEDI,     /* ebxesi */\
ragge
1.34
261           EAXESIEDXESIECXESIESIEDI, -1 },\
ragge
1.40
262         { EBXBLBHEDIEAXEBXEDXEBXECXEBXEBXESI,     /* ebxedi */\
ragge
1.34
263           EAXEDIEDXEDIECXEDIESIEDI, -1 },\
264         { ESIEDIEAXESIEDXESIECXESIEBXESI,             /* esiedi */\
265           EAXEDIEDXEDIECXEDIEBXEDI, -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
ragge
1.22
277
ragge
1.43
278 /* Return a register class based on the type of the node */
ragge
1.34
279 #define PCLASS(p) (p->n_type <= UCHAR ? SBREG : \
ragge
1.23
280                   (p->n_type == LONGLONG || p->n_type == ULONGLONG ? SCREG : \
281                   (p->n_type >= FLOAT && p->n_type <= LDOUBLE ? SDREG : SAREG)))
282
ragge
1.24
283 #define NUMCLASS        4       /* highest number of reg classes used */
ragge
1.22
284
ragge
1.28
285 int COLORMAP(int cint *r);
ragge
1.30
286 #define GCLASS(x) (x < 8 ? CLASSA : x < 16 ? CLASSB : x < 31 ? CLASSC : CLASSD)
ragge
1.39
287 #define DECRA(x,y)      (((x) >> (y*6)) & 63)   /* decode encoded regs */
ragge
1.26
288 #define ENCRD(x)        (x)             /* Encode dest reg in n_reg */
289 #define ENCRA1(x)       ((x) << 6)      /* A1 */
ragge
1.36
290 #define ENCRA2(x)       ((x) << 12)     /* A2 */
ragge
1.39
291 #define ENCRA(x,y)      ((x) << (6+y*6))        /* encode regs in int */
ragge
1.46
292 /* XXX - return char in al? */
ragge
1.37
293 #define RETREG(x)       (x == CHAR || x == UCHAR ? AL : \
294                          x == LONGLONG || x == ULONGLONG ? EAXEDX : \
ragge
1.39
295                          x == FLOAT || x == DOUBLE || x == LDOUBLE ? 31 : EAX)
ragge
1.25
296
gmcgarry
1.68
297 #if 0
298 #define R2REGS  1       /* permit double indexing */
299 #endif
ragge
1.42
300
ragge
1.22
301 /* XXX - to die */
ragge
1.7
302 #define FPREG   EBP     /* frame pointer */
303 #define STKREG  ESP     /* stack pointer */
ragge
1.1
304
ragge
1.41
305 #define SHSTR           (MAXSPECIAL+1)  /* short struct */
306 #define SFUNCALL        (MAXSPECIAL+2)  /* struct assign after function call */
ragge
1.42
307 #define SPCON           (MAXSPECIAL+3)  /* positive nonnamed constant */
stefan
1.49
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)
ragge
1.51
315
316 /*
317  * i386-specific symbol table flags.
318  */
319 #define SSECTION        SLOCAL1
gmcgarry
1.63
320 #define SSTDCALL        SLOCAL2 
321 #define SDLLINDIRECT    SLOCAL3
322
323 /*
324  * i386-specific node flags.
325  */
ragge
1.72
326 #define FSTDCALL        NLOCAL1
327 #define FFPPOP          NLOCAL2
gmcgarry
1.63
328
329 /*
330  * i386-specific interpass stuff.
331  */
332
333 #define TARGET_IPP_MEMBERS                      \
334         int ipp_argstacksize;
gmcgarry
1.57
335
ragge
1.87
336 #define HAVE_WEAKREF
ragge
1.88
337 #define TARGET_FLT_EVAL_METHOD  2       /* all as long double */
ragge
1.87
338
ragge
1.58
339 /*
340  * Extended assembler macros.
341  */
342 void targarg(char *wvoid *arg);
343 #define XASM_TARGARG(w, ary)    \
ragge
1.61
344         (w[1] == 'b' || w[1] == 'h' || w[1] == 'w' || w[1] == 'k' ? \
ragge
1.59
345         w++, targarg(wary), 1 : 0)
ragge
1.62
346 int numconv(void *ipvoid *pvoid *q);
347 #define XASM_NUMCONV(ip, p, q)  numconv(ip, p, q)
ragge
1.67
348 int xasmconstregs(char *);
349 #define XASMCONSTREGS(x) xasmconstregs(x)
ragge
1.75
350 #define MYSETXARG if (XASMVAL(cw) == 'q') {     \
ragge
1.77
351         c = 'r'addalledges(&ablock[ESI]); addalledges(&ablock[EDI]); }
ragge
1.58
352
gmcgarry
1.60
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 *listchar *name);
361 #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-02 20:53 +0200