* add p cc
[mascara-docs.git] / compilers / pcc / pcc-1.0.0 / arch / sparc64 / macdefs.h
blob5d0ec81ddb3938ff74596f7cb92400fbcfd137fc
1 /*
2 * Copyright (c) 2008 David Crawshaw <david@zentus.com>
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 * Many arithmetic instructions take 'reg_or_imm' in SPARCv9, where imm
20 * means we can use a signed 13-bit constant (simm13). This gives us a
21 * shortcut for small constants, instead of loading them into a register.
22 * Special handling is required because 13 bits lies between SSCON and SCON.
24 #define SIMM13(val) (val < 4096 && val > -4097)
27 * The SPARCv9 ABI specifies a stack bias of 2047 bits. This means that the
28 * end of our call space is %fp+V9BIAS, working back towards %sp+V9BIAS+176.
30 #define V9BIAS 2047
33 * The ABI requires that every frame reserve 176 bits for saving registers
34 * in the case of a spill. The stack size must be 16-bit aligned.
36 #define V9RESERVE 176
37 #define V9STEP(x) ALIGN(x, 0xf)
38 #define ALIGN(x, y) ((x & y) ? (x + y) & ~y : x)
41 #define makecc(val,i) lastcon = (lastcon<<8)|((val<<24)>>24);
43 #define ARGINIT (7*8) /* XXX */
44 #define AUTOINIT (0)
46 /* Type sizes */
47 #define SZCHAR 8
48 #define SZBOOL 32
49 #define SZINT 32
50 #define SZFLOAT 32
51 #define SZDOUBLE 64
52 #define SZLDOUBLE 64
53 #define SZLONG 64
54 #define SZSHORT 16
55 #define SZLONGLONG 64
56 #define SZPOINT(t) 64
58 /* Type alignments */
59 #define ALCHAR 8
60 #define ALBOOL 32
61 #define ALINT 32
62 #define ALFLOAT 32
63 #define ALDOUBLE 64
64 #define ALLDOUBLE 64
65 #define ALLONG 64
66 #define ALLONGLONG 64
67 #define ALSHORT 16
68 #define ALPOINT 64
69 #define ALSTRUCT 32
70 #define ALSTACK 64
72 /* Min/max values. */
73 #define MIN_CHAR -128
74 #define MAX_CHAR 127
75 #define MAX_UCHAR 255
76 #define MIN_SHORT -32768
77 #define MAX_SHORT 32767
78 #define MAX_USHORT 65535
79 #define MIN_INT -1
80 #define MAX_INT 0x7fffffff
81 #define MAX_UNSIGNED 0xffffffff
82 #define MIN_LONGLONG 0x8000000000000000LL
83 #define MAX_LONGLONG 0x7fffffffffffffffLL
84 #define MAX_ULONGLONG 0xffffffffffffffffULL
85 #define MIN_LONG MIN_LONGLONG
86 #define MAX_LONG MAX_LONGLONG
87 #define MAX_ULONG MAX_ULONGLONG
89 #define BOOL_TYPE INT
91 typedef long long CONSZ;
92 typedef unsigned long long U_CONSZ;
93 typedef long long OFFSZ;
95 #define CONFMT "%lld"
96 #define LABFMT "L%d"
97 #define STABLBL "LL%d"
99 #define BACKAUTO /* Stack grows negatively for automatics. */
100 #define BACKTEMP /* Stack grows negatively for temporaries. */
102 #undef FIELDOPS
103 #define RTOLBYTES
105 #define ENUMSIZE(high,low) INT
106 #define BYTEOFF(x) ((x)&03)
107 #define BITOOR(x) (x)
109 #define szty(t) ((ISPTR(t) || (t) == DOUBLE || \
110 (t) == LONG || (t) == ULONG || \
111 (t) == LONGLONG || (t) == ULONGLONG) ? 2 : 1)
114 /* Register names. */
116 #define MAXREGS (31 + 31 + 16 + 2)
117 #define NUMCLASS 4
119 //define G0 -1
120 #define G1 0
121 #define G2 1
122 #define G3 2
123 #define G4 3
124 #define G5 4
125 #define G6 5
126 #define G7 6
127 #define O0 7
128 #define O1 8
129 #define O2 9
130 #define O3 10
131 #define O4 11
132 #define O5 12
133 #define O6 13
134 #define O7 14
135 #define L0 15
136 #define L1 16
137 #define L2 17
138 #define L3 18
139 #define L4 19
140 #define L5 20
141 #define L6 21
142 #define L7 22
143 #define I0 23
144 #define I1 24
145 #define I2 25
146 #define I3 26
147 #define I4 27
148 #define I5 28
149 #define I6 29
150 #define I7 30
152 #define F0 31
153 #define F1 32
154 #define F2 33
155 #define F3 34
156 #define F4 35
157 #define F5 36
158 #define F6 37
159 #define F7 38
160 #define F8 39
161 #define F9 40
162 #define F10 41
163 #define F11 42
164 #define F12 43
165 #define F13 44
166 #define F14 45
167 #define F15 46
168 #define F16 47
169 #define F17 48
170 #define F18 49
171 #define F19 50
172 #define F20 51
173 #define F21 52
174 #define F22 53
175 #define F23 54
176 #define F24 55
177 #define F25 56
178 #define F26 57
179 #define F27 58
180 #define F28 59
181 #define F29 60
182 #define F30 61
183 //define F31 XXX
184 #define D0 62
185 #define D1 63
186 #define D2 64
187 #define D3 65
188 #define D4 66
189 #define D5 67
190 #define D6 68
191 #define D7 69
192 #define D8 70
193 #define D9 71
194 #define D10 72
195 #define D11 73
196 #define D12 74
197 #define D13 75
198 #define D14 76
199 #define D15 77
201 #define SP 78
202 #define FP 79
204 #define FPREG FP
206 #define RETREG(x) ((x)==DOUBLE ? D0 : (x)==FLOAT ? F1 : O0)
207 #define RETREG_PRE(x) ((x)==DOUBLE ? D0 : (x)==FLOAT ? F1 : I0)
209 #define RSTATUS \
210 /* global */ \
211 SAREG|PERMREG, SAREG|PERMREG, SAREG|PERMREG, \
212 SAREG|PERMREG, SAREG|PERMREG, SAREG|PERMREG, SAREG|PERMREG, \
213 /* out */ \
214 SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
215 SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
216 /* local */ \
217 SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
218 SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
219 /* in */ \
220 SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
221 SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
222 /* 32-bit floating point */ \
223 SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, \
224 SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, \
225 SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, \
226 SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, /*, SBREG */ \
227 /* 64-bit floating point */ \
228 SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, \
229 SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, \
230 /* sp */ SDREG, \
231 /* fp */ SDREG
233 #define ROVERLAP \
234 { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, \
235 { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, \
236 { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, \
237 { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, \
238 /* 32-bit floating point */ \
239 { D0, -1 }, { D0, -1 }, { D1, -1 }, { D1, -1 }, \
240 { D2, -1 }, { D2, -1 }, { D3, -1 }, { D3, -1 }, \
241 { D4, -1 }, { D4, -1 }, { D5, -1 }, { D5, -1 }, \
242 { D6, -1 }, { D6, -1 }, { D7, -1 }, { D7, -1 }, \
243 { D8, -1 }, { D8, -1 }, { D9, -1 }, { D9, -1 }, \
244 { D10, -1 }, { D10, -1 }, { D11, -1 }, { D11, -1 }, \
245 { D12, -1 }, { D12, -1 }, { D13, -1 }, { D13, -1 }, \
246 { D14, -1 }, { D14, -1 }, { D15, -1 }, /* { D15, -1 }, */ \
247 /* 64-bit floating point */ \
248 { F0, F1, -1 }, { F2, F3, -1 }, { F4, F5, -1 }, \
249 { F6, F7, -1 }, { F8, F9, -1 }, { F10, F11, -1 }, \
250 { F12, F13, -1 }, { F14, F15, -1 }, { F16, F17, -1 }, \
251 { F18, F19, -1 }, { F20, F21, -1 }, { F22, F23, -1 }, \
252 { F24, F25, -1 }, { F26, F27, -1 }, { F28, F29, -1 }, \
253 { F30, /* F31, */ -1 }, \
254 { -1 }, \
255 { -1 }
257 #define GCLASS(x) (x <= I7 ? CLASSA : \
258 (x <= F30 ? CLASSB : \
259 (x <= D15 ? CLASSC : \
260 (x == SP || x == FP ? CLASSD : 0))))
261 #define PCLASS(p) (1 << gclass((p)->n_type))
262 #define DECRA(x,y) (((x) >> (y*7)) & 127)
263 #define ENCRA(x,y) ((x) << (7+y*7))
264 #define ENCRD(x) (x)
266 int COLORMAP(int c, int *r);