Quick Search:

View

Revision:
Expand:  
Changeset: MAIN:ragge:20110605101924

Diff

Diff from 1.20 to:

Annotations

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

Annotated File View

ragge
1.20
1 /*      $Id: macdefs.h,v 1.20 2011/06/05 10:19:24 ragge 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
ragge
1.6
39 #define ARGINIT         128     /* # bits above fp where arguments start */
mickey
1.1
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
ragge
1.8
69 /* #undef ALSTRUCT      amd64 struct alignment is member defined */
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
ragge
1.17
84 #define MAX_UNSIGNED    0xffffffffU
85 #define MIN_LONG        0x8000000000000000L
86 #define MAX_LONG        0x7fffffffffffffffL
87 #define MAX_ULONG       0xffffffffffffffffUL
mickey
1.1
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
ragge
1.18
94 #define BOOL_TYPE       UCHAR   /* what used to store _Bool */
mickey
1.1
95
96 /*
97  * Use large-enough types.
98  */
99 typedef long long CONSZ;
100 typedef unsigned long long U_CONSZ;
101 typedef long long OFFSZ;
102
103 #define CONFMT  "%lld"          /* format for printing constants */
104 #define LABFMT  ".L%d"          /* format for printing labels */
105 #define STABLBL ".LL%d"         /* format for stab (debugging) labels */
106 #ifdef LANG_F77
107 #define BLANKCOMMON "_BLNK_"
108 #define MSKIREG  (M(TYSHORT)|M(TYLONG))
109 #define TYIREG TYLONG
110 #define FSZLENG  FSZLONG
111 #define AUTOREG EBP
112 #define ARGREG  EBP
113 #define ARGOFFSET 8
114 #endif
115
116 #define BACKAUTO                /* stack grows negatively for automatics */
117 #define BACKTEMP                /* stack grows negatively for temporaries */
118
119 #undef  FIELDOPS                /* no bit-field instructions */
ragge
1.20
120 #define TARGET_ENDIAN TARGET_LE /* little-endian only */
mickey
1.1
121
122 #define FINDMOPS        /* i386 has instructions that modifies memory */
123
ragge
1.15
124 #define CC_DIV_0        /* division by zero is safe in the compiler */
125
mickey
1.1
126 /* Definitions mostly used in pass2 */
127
ragge
1.5
128 #define BYTEOFF(x)      ((x)&07)
mickey
1.1
129 #define wdal(k)         (BYTEOFF(k)==0)
130 #define BITOOR(x)       (x)     /* bit offset to oreg offset XXX die! */
131
132 #define STOARG(p)
133 #define STOFARG(p)
134 #define STOSTARG(p)
135 #define genfcall(a,b)   gencall(a,b)
136
ragge
1.7
137 /* How many integer registers are needed? (used for stack allocation) */
138 #define szty(t) (t < LONG || t == FLOAT ? 1 : t == LDOUBLE ? 4 : 2)
mickey
1.1
139
140 /*
ragge
1.5
141  * The amd64 architecture has a much cleaner interface to its registers
142  * than the x86, even though a part of the register block comes from 
143  * the x86 architecture.  Therefore currently only two non-overlapping 
144  * register classes are used; integer and xmm registers.
145  *
146  * All registers are given a sequential number to
mickey
1.1
147  * identify it which must match rnames[] in local2.c.
148  *
ragge
1.5
149  * The classes used on amd64 are:
150  *      A - integer registers
151  *      B - xmm registers
ragge
1.12
152  *      C - x87 registers
ragge
1.5
153  */
154 #define RAX     000
155 #define RDX     001
156 #define RCX     002
157 #define RBX     003
158 #define RSI     004
159 #define RDI     005
160 #define RBP     006
161 #define RSP     007
162 #define R08     010
163 #define R09     011
164 #define R10     012
165 #define R11     013
166 #define R12     014
167 #define R13     015
168 #define R14     016
169 #define R15     017
170
171 #define XMM0    020
172 #define XMM1    021
173 #define XMM2    022
174 #define XMM3    023
175 #define XMM4    024
176 #define XMM5    025
177 #define XMM6    026
178 #define XMM7    027
179 #define XMM8    030
180 #define XMM9    031
181 #define XMM10   032
182 #define XMM11   033
183 #define XMM12   034
184 #define XMM13   035
185 #define XMM14   036
186 #define XMM15   037
mickey
1.1
187
ragge
1.12
188 #define MAXREGS 050     /* 40 registers */
mickey
1.1
189
190 #define RSTATUS \
191         SAREG|TEMPREGSAREG|TEMPREGSAREG|TEMPREGSAREG|PERMREG,     \
192         SAREG|TEMPREGSAREG|TEMPREG00,                             \
ragge
1.5
193         SAREG|TEMPREGSAREG|TEMPREGSAREG|TEMPREGSAREG|TEMPREG,     \
194         SAREG|PERMREGSAREG|PERMREGSAREG|PERMREGSAREG|PERMREG,     \
195         SBREG|TEMPREGSBREG|TEMPREGSBREG|TEMPREGSBREG|TEMPREG,     \
196         SBREG|TEMPREGSBREG|TEMPREGSBREG|TEMPREGSBREG|TEMPREG,     \
197         SBREG|TEMPREGSBREG|TEMPREGSBREG|TEMPREGSBREG|TEMPREG,     \
ragge
1.12
198         SBREG|TEMPREGSBREG|TEMPREGSBREG|TEMPREGSBREG|TEMPREG,     \
199         SCREGSCREGSCREGSCREG,  SCREGSCREGSCREGSCREG,
200
mickey
1.1
201
ragge
1.5
202 /* no overlapping registers at all */
mickey
1.1
203 #define ROVERLAP \
ragge
1.5
204         { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, \
205         { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, \
206         { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, \
ragge
1.12
207         { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, \
ragge
1.5
208         { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 },
mickey
1.1
209
210
211 /* Return a register class based on the type of the node */
ragge
1.12
212 #define PCLASS(p) (p->n_type == FLOAT || p->n_type == DOUBLE ? SBREG : \
213                    p->n_type == LDOUBLE ? SCREG : SAREG)
mickey
1.1
214
ragge
1.12
215 #define NUMCLASS        3       /* highest number of reg classes used */
mickey
1.1
216
217 int COLORMAP(int cint *r);
ragge
1.12
218 #define GCLASS(x) (x < 16 ? CLASSA : x < 32 ? CLASSB : CLASSC)
mickey
1.1
219 #define DECRA(x,y)      (((x) >> (y*8)) & 255)  /* decode encoded regs */
220 #define ENCRD(x)        (x)             /* Encode dest reg in n_reg */
221 #define ENCRA1(x)       ((x) << 8)      /* A1 */
222 #define ENCRA2(x)       ((x) << 16)     /* A2 */
223 #define ENCRA(x,y)      ((x) << (8+y*8))        /* encode regs in int */
224
ragge
1.12
225 #define RETREG(x)       (x == FLOAT || x == DOUBLE ? XMM0 : \
226                          x == LDOUBLE ? 32 : RAX)
mickey
1.1
227
228 /* XXX - to die */
229 #define FPREG   RBP     /* frame pointer */
230 #define STKREG  RSP     /* stack pointer */
231
232 #define SHSTR           (MAXSPECIAL+1)  /* short struct */
233 #define SFUNCALL        (MAXSPECIAL+2)  /* struct assign after function call */
234 #define SPCON           (MAXSPECIAL+3)  /* positive nonnamed constant */
235
236 /*
237  * Specials that indicate the applicability of machine idioms.
238  */
239 #define SMIXOR          (MAXSPECIAL+4)
240 #define SMILWXOR        (MAXSPECIAL+5)
241 #define SMIHWXOR        (MAXSPECIAL+6)
ragge
1.7
242 #define SCON32          (MAXSPECIAL+7)  /* 32-bit constant */
mickey
1.1
243
244 /*
245  * i386-specific symbol table flags.
246  */
ragge
1.13
247 #define SBEENHERE       SLOCAL1
mickey
1.1
248 #define STLS            SLOCAL2
249
250 /*
251  * Extended assembler macros.
252  */
ragge
1.16
253 int xasmconstregs(char *);
ragge
1.14
254 void targarg(char *wvoid *argint n);
mickey
1.1
255 #define XASM_TARGARG(w, ary)    \
256         (w[1] == 'b' || w[1] == 'h' || w[1] == 'w' || w[1] == 'k' ? \
ragge
1.14
257         w++, targarg(waryn), 1 : 0)
mickey
1.1
258 int numconv(void *ipvoid *pvoid *q);
259 #define XASM_NUMCONV(ip, p, q)  numconv(ip, p, q)
ragge
1.16
260 #define XASMCONSTREGS(x)        xasmconstregs(x)
mickey
1.1
261
262 /*
263  * builtins.
264  */
ragge
1.9
265 #define TARGET_VALIST
266 #define TARGET_STDARGS
mickey
1.1
267 #define TARGET_BUILTINS                                                 \
ragge
1.10
268         { "__builtin_stdarg_start"amd64_builtin_stdarg_start2 },    \
269         { "__builtin_va_start"amd64_builtin_stdarg_start2 },        \
270         { "__builtin_va_arg"amd64_builtin_va_arg2 },                \
271         { "__builtin_va_end"amd64_builtin_va_end1 },                \
272         { "__builtin_va_copy"amd64_builtin_va_copy2 },              \
273         { "__builtin_frame_address"i386_builtin_frame_address, -1 },  \
274         { "__builtin_return_address"i386_builtin_return_address, -1 },
mickey
1.1
275
276 #define NODE struct node
277 struct node;
ragge
1.11
278 NODE *amd64_builtin_stdarg_start(NODE *fNODE *aunsigned int);
279 NODE *amd64_builtin_va_arg(NODE *fNODE *aunsigned int);
280 NODE *amd64_builtin_va_end(NODE *fNODE *aunsigned int);
281 NODE *amd64_builtin_va_copy(NODE *fNODE *aunsigned int);
282 NODE *i386_builtin_frame_address(NODE *fNODE *aunsigned int);
283 NODE *i386_builtin_return_address(NODE *fNODE *aunsigned int);
mickey
1.1
284 #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-30 16:08 +0100