xref: /netbsd-src/external/bsd/pcc/dist/pcc/arch/hppa/macdefs.h (revision 411dcbec990c8aa9c57d3bd2f4bcacadec0b1ab5)
1 /*	Id: macdefs.h,v 1.21 2015/11/24 17:35:11 ragge Exp 	*/
2 /*	$NetBSD: macdefs.h,v 1.1.1.6 2016/02/09 20:28:15 plunky Exp $	*/
3 
4 /*
5  * Copyright (c) 2007 Michael Shalayeff
6  * Copyright (c) 2003 Anders Magnusson (ragge@ludd.luth.se).
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  * 3. The name of the author may not be used to endorse or promote products
18  *    derived from this software without specific prior written permission
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 /*
33  * Convert (multi-)character constant to integer.
34  */
35 #define	makecc(val,i)	(lastcon = (lastcon<<8)|((val<<24)>>24))
36 
37 #define	ARGINIT		(32*8)	/* bits below fp where args start */
38 #define	AUTOINIT	(4*8)	/* bits above fp where locals start */
39 
40 /*
41  * storage sizes
42  */
43 #define	SZCHAR		8
44 #define	SZBOOL		8
45 #define	SZINT		32
46 #define	SZFLOAT		32
47 #define	SZDOUBLE	64
48 #define	SZLDOUBLE	64	/* or later 128 */
49 #define	SZLONG		32
50 #define	SZSHORT		16
51 #define	SZLONGLONG	64
52 #define	SZPOINT(t)	32
53 
54 /*
55  * alignment requirements
56  */
57 #define	ALCHAR		8
58 #define	ALBOOL		8
59 #define	ALINT		32
60 #define	ALFLOAT		32
61 #define	ALDOUBLE	64
62 #define	ALLDOUBLE	64	/* 128 later */
63 #define	ALLONG		32
64 #define	ALLONGLONG	32
65 #define	ALSHORT		16
66 #define	ALPOINT		32
67 #define	ALSTRUCT	32
68 #define	ALSTACK		64
69 
70 /*
71  * type value limits
72  */
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		(-0x7fffffff-1)
80 #define	MAX_INT		0x7fffffff
81 #define	MAX_UNSIGNED	0xffffffff
82 #define	MIN_LONG	MIN_INT
83 #define	MAX_LONG	MAX_INT
84 #define	MAX_ULONG	MAX_UNSIGNED
85 #define	MIN_LONGLONG	(-0x7fffffffffffffffLL-1)
86 #define	MAX_LONGLONG	0x7fffffffffffffffLL
87 #define	MAX_ULONGLONG	0xffffffffffffffffULL
88 
89 #undef	CHAR_UNSIGNED
90 #define	BOOL_TYPE	CHAR
91 
92 typedef long long CONSZ;
93 typedef unsigned long long U_CONSZ;
94 typedef long long OFFSZ;
95 
96 #define	CONFMT	"%lld"		/* format for printing constants */
97 #define	LABFMT	".L%d"		/* format for printing labels */
98 #define	STABLBL	".LL%d"		/* format for stab (debugging) labels */
99 
100 #undef	BACKAUTO	/* stack grows upwards */
101 #undef	BACKTEMP	/* stack grows upwards */
102 
103 #define	FIELDOPS	/* have bit field ops */
104 #define	TARGET_ENDIAN	TARGET_BE
105 #define	TARGET_FLT_EVAL_METHOD	0	/* all as their type */
106 
107 #define	BYTEOFF(x)	((x)&03)
108 #define	wdal(k)		(BYTEOFF(k)==0)
109 
110 #define	STOARG(p)
111 #define	STOFARG(p)
112 #define	STOSTARG(p)
113 
114 #define	szty(t)	(((t) == DOUBLE || (t) == LONGLONG || (t) == ULONGLONG) ? 2 : \
115 	    (t) == LDOUBLE ? 2 : 1)
116 
117 #define	R0	0
118 #define	R1	1
119 #define	RP	2
120 #define	FP	3
121 #define	R4	4
122 #define	R5	5
123 #define	R6	6
124 #define	R7	7
125 #define	R8	8
126 #define	R9	9
127 #define	R10	10
128 #define	R11	11
129 #define	R12	12
130 #define	R13	13
131 #define	R14	14
132 #define	R15	15
133 #define	R16	16
134 #define	R17	17
135 #define	R18	18
136 #define	T4	19
137 #define	T3	20
138 #define	T2	21
139 #define	T1	22
140 #define	ARG3	23
141 #define	ARG2	24
142 #define	ARG1	25
143 #define	ARG0	26
144 #define	DP	27
145 #define	RET0	28
146 #define	RET1	29
147 #define	SP	30
148 #define	R31	31
149 
150 /* double regs overlay */
151 #define	RD0	32	/* r0:r0 */
152 #define	RD1	33	/* r1:r31 */
153 #define	RD2	34	/* r1:t4 */
154 #define	RD3	35	/* r1:t3 */
155 #define	RD4	36	/* r1:t2 */
156 #define	RD5	37	/* r1:t1 */
157 #define	RD6	38	/* r31:t4 */
158 #define	RD7	39	/* r31:t3 */
159 #define	RD8	40	/* r31:t2 */
160 #define	RD9	41	/* r31:t1 */
161 #define	RD10	42	/* r4:r18 */
162 #define	RD11	43	/* r5:r4 */
163 #define	RD12	44	/* r6:r5 */
164 #define	RD13	45	/* r7:r6 */
165 #define	RD14	46	/* r8:r7 */
166 #define	RD15	47	/* r9:r8 */
167 #define	RD16	48	/* r10:r9 */
168 #define	RD17	49	/* r11:r10 */
169 #define	RD18	50	/* r12:r11 */
170 #define	RD19	51	/* r13:r12 */
171 #define	RD20	52	/* r14:r13 */
172 #define	RD21	53	/* r15:r14 */
173 #define	RD22	54	/* r16:r15 */
174 #define	RD23	55	/* r17:r16 */
175 #define	RD24	56	/* r18:r17 */
176 #define	TD4	57	/* t1:t4 */
177 #define	TD3	58	/* t4:t3 */
178 #define	TD2	59	/* t3:t2 */
179 #define	TD1	60	/* t2:t1 */
180 #define	AD2	61	/* arg3:arg2 */
181 #define	AD1	62	/* arg1:arg0 */
182 #define	RETD0	63	/* ret1:ret0 */
183 
184 /* FPU regs */
185 #define	FR0	64
186 #define	FR4	65
187 #define	FR5	66
188 #define	FR6	67
189 #define	FR7	68
190 #define	FR8	69
191 #define	FR9	70
192 #define	FR10	71
193 #define	FR11	72
194 #define	FR12	73
195 #define	FR13	74
196 #define	FR14	75
197 #define	FR15	76
198 #define	FR16	77
199 #define	FR17	78
200 #define	FR18	79
201 #define	FR19	80
202 #define	FR20	81
203 #define	FR21	82
204 #define	FR22	83
205 #define	FR23	84
206 #define	FR24	85
207 #define	FR25	86
208 #define	FR26	87
209 #define	FR27	88
210 #define	FR28	89
211 #define	FR29	90
212 #define	FR30	91
213 #define	FR31	92
214 
215 #define	FR0L	93
216 #define	FR0R	94
217 #define	FR4L	95
218 #define	FR4R	96
219 #define	FR5L	97
220 #define	FR5R	98
221 #define	FR6L	99
222 #define	FR6R	100
223 #define	FR7L	101
224 #define	FR7R	102
225 #define	FR8L	103
226 #define	FR8R	104
227 #define	FR9L	105
228 #define	FR9R	106
229 #define	FR10L	107
230 #define	FR10R	108
231 #define	FR11L	109
232 #define	FR11R	110
233 #define	FR12L	111
234 #define	FR12R	112
235 #define	FR13L	113
236 #define	FR13R	114
237 #define	FR14L	115
238 #define	FR14R	116
239 #define	FR15L	117
240 #define	FR15R	118
241 #define	FR16L	119
242 #define	FR16R	120
243 #define	FR17L	121
244 #define	FR17R	122
245 #define	FR18L	123
246 #define	FR18R	124
247 #ifdef __hppa64__
248 #define	FR19L	125
249 #define	FR19R	126
250 #define	FR20L	127
251 #define	FR20R	128
252 #define	FR21L	129
253 #define	FR21R	130
254 #define	FR22L	131
255 #define	FR22R	132
256 #define	FR23L	133
257 #define	FR23R	134
258 #define	FR24L	135
259 #define	FR24R	136
260 #define	FR25L	137
261 #define	FR25R	138
262 #define	FR26L	139
263 #define	FR26R	140
264 #define	FR27L	141
265 #define	FR27R	142
266 #define	FR28L	143
267 #define	FR28R	144
268 #define	FR29L	145
269 #define	FR29R	146
270 #define	FR30L	147
271 #define	FR30R	148
272 #define	FR31L	149
273 #define	FR31R	150
274 
275 #define	MAXREGS	151
276 #else
277 #define	MAXREGS	125
278 #endif
279 
280 #define	RSTATUS \
281 	0, SAREG|TEMPREG, 0, 0, SAREG|PERMREG, SAREG|PERMREG,		\
282 	SAREG|PERMREG, SAREG|PERMREG, SAREG|PERMREG, SAREG|PERMREG,	\
283 	SAREG|PERMREG, SAREG|PERMREG, SAREG|PERMREG, SAREG|PERMREG,	\
284 	SAREG|PERMREG, SAREG|PERMREG, SAREG|PERMREG, SAREG|PERMREG,	\
285 	SAREG|PERMREG,							\
286 	SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, 	\
287 	SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, 	\
288 	0, SAREG|TEMPREG, SAREG|TEMPREG, 0, SAREG|TEMPREG,		\
289 	/* double overlays */						\
290 	0,								\
291 	SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG,		\
292 	SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG,		\
293 	SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG,		\
294 	SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG,		\
295 	/* double-precision floats */					\
296 	0,								\
297 	SDREG|TEMPREG, SDREG|TEMPREG, SDREG|TEMPREG, SDREG|TEMPREG,	\
298 	SDREG|TEMPREG, SDREG|TEMPREG, SDREG|TEMPREG, SDREG|TEMPREG,	\
299 	SDREG|PERMREG, SDREG|PERMREG, SDREG|PERMREG, SDREG|PERMREG,	\
300 	SDREG|PERMREG, SDREG|PERMREG, SDREG|PERMREG, SDREG|PERMREG,	\
301 	SDREG|PERMREG, SDREG|PERMREG,					\
302 	SDREG|TEMPREG, SDREG|TEMPREG, SDREG|TEMPREG, SDREG|TEMPREG,	\
303 	SDREG|TEMPREG, SDREG|TEMPREG, SDREG|TEMPREG, SDREG|TEMPREG,	\
304 	SDREG|TEMPREG, SDREG|TEMPREG,					\
305 	/* single-precision floats */					\
306 	0, 0,								\
307 	SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG,		\
308 	SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG,		\
309 	SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG,		\
310 	SCREG, SCREG, SCREG, SCREG, SCREG, SCREG,
311 #ifdef __hppa64__
312 	SCREG, SCREG,		\
313 	SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG,		\
314 	SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG,		\
315 	SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG,
316 #endif
317 
318 #define	ROVERLAP \
319 	{ -1 },				\
320 	{ RD1, RD2, RD3, RD4, RD5, -1 },\
321 	{ -1 }, { -1 },			\
322 	{ RD10, RD11, -1 },		\
323 	{ RD11, RD12, -1 },		\
324 	{ RD12, RD13, -1 },		\
325 	{ RD13, RD14, -1 },		\
326 	{ RD14, RD15, -1 },		\
327 	{ RD15, RD16, -1 },		\
328 	{ RD16, RD17, -1 },		\
329 	{ RD17, RD18, -1 },		\
330 	{ RD18, RD19, -1 },		\
331 	{ RD19, RD20, -1 },		\
332 	{ RD20, RD21, -1 },		\
333 	{ RD21, RD22, -1 },		\
334 	{ RD22, RD23, -1 },		\
335 	{ RD23, RD24, -1 },		\
336 	{ RD24, RD10, -1 },		\
337 	{ TD1, TD4, -1 },		\
338 	{ TD3, TD2, -1 },		\
339 	{ TD1, TD2, -1 },		\
340 	{ TD1, TD4, -1 },		\
341 	{ AD2, -1 }, { AD2, -1 },	\
342 	{ AD1, -1 }, { AD1, -1 },	\
343 	{ -1 },				\
344 	{ RETD0, -1 }, { RETD0, -1 },	\
345 	{ -1 },				\
346 	{ RD1, RD5, RD6, RD7, RD8, -1 },\
347 	{ -1 },				\
348 	{ R1, R31, -1 },		\
349 	{ R1, T4, -1 },			\
350 	{ R1, T3, -1 },			\
351 	{ R1, T2, -1 },			\
352 	{ R1, T1, -1 },			\
353 	{ R31, T4, -1 },		\
354 	{ R31, T3, -1 },		\
355 	{ R31, T2, -1 },		\
356 	{ R31, T1, -1 },		\
357 	{ R4, R18, -1 },		\
358 	{ R5, R4, -1 },			\
359 	{ R6, R5, -1 },			\
360 	{ R7, R6, -1 },			\
361 	{ R8, R7, -1 },			\
362 	{ R9, R8, -1 },			\
363 	{ R10, R9, -1 },		\
364 	{ R11, R10, -1 },		\
365 	{ R12, R11, -1 },		\
366 	{ R13, R12, -1 },		\
367 	{ R14, R15, -1 },		\
368 	{ R15, R14, -1 },		\
369 	{ R16, R15, -1 },		\
370 	{ R17, R16, -1 },		\
371 	{ R18, R17, -1 },		\
372 	{ T1, T4, -1 },			\
373 	{ T4, T3, -1 },			\
374 	{ T3, T2, -1 },			\
375 	{ T2, T1, -1 },			\
376 	{ ARG3, ARG2, -1 },		\
377 	{ ARG1, ARG0, -1 },		\
378 	{ RET1, RET0, -1 },		\
379 	{ -1 },				\
380 	{ FR4L, FR4R, -1 },		\
381 	{ FR5L, FR5R, -1 },		\
382 	{ FR6L, FR6R, -1 },		\
383 	{ FR7L, FR7R, -1 },		\
384 	{ FR8L, FR8R, -1 },		\
385 	{ FR9L, FR9R, -1 },		\
386 	{ FR10L, FR10R, -1 },		\
387 	{ FR11L, FR11R, -1 },		\
388 	{ FR12L, FR12R, -1 },		\
389 	{ FR13L, FR13R, -1 },		\
390 	{ FR14L, FR14R, -1 },		\
391 	{ FR15L, FR15R, -1 },		\
392 	{ FR16L, FR16R, -1 },		\
393 	{ FR17L, FR17R, -1 },		\
394 	{ FR18L, FR18R, -1 },		\
395 	{ -1 },				\
396 	{ -1 },				\
397 	{ -1 },				\
398 	{ -1 },				\
399 	{ -1 },				\
400 	{ -1 },				\
401 	{ -1 },				\
402 	{ -1 },				\
403 	{ -1 },				\
404 	{ -1 },				\
405 	{ -1 },				\
406 	{ -1 },				\
407 	{ -1 },				\
408 	{ -1 }, { -1 },			\
409 	{ FR4, -1 }, { FR4, -1 },	\
410 	{ FR5, -1 }, { FR5, -1 },	\
411 	{ FR6, -1 }, { FR6, -1 },	\
412 	{ FR7, -1 }, { FR7, -1 },	\
413 	{ FR8, -1 }, { FR8, -1 },	\
414 	{ FR9, -1 }, { FR9, -1 },	\
415 	{ FR10, -1 }, { FR10, -1 },	\
416 	{ FR11, -1 }, { FR11, -1 },	\
417 	{ FR12, -1 }, { FR12, -1 },	\
418 	{ FR13, -1 }, { FR13, -1 },	\
419 	{ FR14, -1 }, { FR14, -1 },	\
420 	{ FR15, -1 }, { FR15, -1 },	\
421 	{ FR16, -1 }, { FR16, -1 },	\
422 	{ FR17, -1 }, { FR17, -1 },	\
423 	{ FR18, -1 }, { FR18, -1 },
424 #ifdef __hppa64__
425 	{ FR19, -1 }, { FR19, -1 },	\
426 	{ FR20, -1 }, { FR20, -1 },	\
427 	{ FR21, -1 }, { FR21, -1 },	\
428 	{ FR22, -1 }, { FR22, -1 },	\
429 	{ FR23, -1 }, { FR23, -1 },	\
430 	{ FR24, -1 }, { FR24, -1 },	\
431 	{ FR25, -1 }, { FR25, -1 },	\
432 	{ FR26, -1 }, { FR26, -1 },	\
433 	{ FR27, -1 }, { FR27, -1 },	\
434 	{ FR28, -1 }, { FR28, -1 },	\
435 	{ FR29, -1 }, { FR29, -1 },	\
436 	{ FR30, -1 }, { FR30, -1 },	\
437 	{ FR31, -1 }, { FR31, -1 },
438 #endif
439 
440 #define	PCLASS(p)	\
441 	(p->n_type == LONGLONG || p->n_type == ULONGLONG ? SBREG : \
442 	(p->n_type == FLOAT ? SCREG : \
443 	(p->n_type == DOUBLE || p->n_type == LDOUBLE ? SDREG : SAREG)))
444 
445 #define	NUMCLASS	4	/* highest number of reg classes used */
446 
447 int COLORMAP(int c, int *r);
448 #define	PERMTYPE(x) ((x) < 32? INT : ((x) < 64? LONGLONG : ((x) < 93? LDOUBLE : FLOAT)))
449 #define	GCLASS(x) ((x) < 32? CLASSA : ((x) < 64? CLASSB : ((x) < 93? CLASSD : CLASSC)))
450 #define	DECRA(x,y)	(((x) >> (y*8)) & 255)	/* decode encoded regs */
451 #define	ENCRD(x)	(x)			/* Encode dest reg in n_reg */
452 #define	ENCRA1(x)	((x) << 8)		/* A1 */
453 #define	ENCRA2(x)	((x) << 16)		/* A2 */
454 #define	ENCRA(x,y)	((x) << (8+y*8))	/* encode regs in int */
455 #define	RETREG(x)	(x == LONGLONG || x == ULONGLONG ? RETD0 : \
456 			 x == FLOAT? FR4L : \
457 			 x == DOUBLE || x == LDOUBLE ? FR4 : RET0)
458 
459 #define	FPREG	FP	/* frame pointer */
460 #define	STKREG	SP	/* stack pointer */
461 
462 #define	MYREADER(p)	myreader(p)
463 #define	MYCANON(p)	mycanon(p)
464 #define	MYOPTIM
465 
466 #define	SFUNCALL	(MAXSPECIAL+1)	/* struct assign after function call */
467 #define	SPCNHI		(MAXSPECIAL+2)	/* high 21bits constant */
468 #define	SPCON		(MAXSPECIAL+3)	/* smaller constant */
469 #define	SPICON		(MAXSPECIAL+4)	/* even smaller constant */
470 #define	SPCNHW		(MAXSPECIAL+5)	/* LL const w/ 0 in low word */
471 #define	SPCNLW		(MAXSPECIAL+6)	/* LL const w/ 0 in high word */
472 #define	SPIMM		(MAXSPECIAL+7)	/* immidiate const for depi/comib */
473 #define	SPNAME		(MAXSPECIAL+8)	/* ext symbol reference load/store */
474 #define NATIVE_FLOATING_POINT
475