xref: /netbsd-src/external/bsd/pcc/dist/pcc/arch/nova/macdefs.h (revision 411dcbec990c8aa9c57d3bd2f4bcacadec0b1ab5)
1 /*	Id: macdefs.h,v 1.9 2015/11/24 17:35:12 ragge Exp 	*/
2 /*	$NetBSD: macdefs.h,v 1.1.1.5 2016/02/09 20:28:24 plunky Exp $	*/
3 /*
4  * Copyright (c) 2006 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  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 /*
29  * Machine-dependent defines for Data General Nova.
30  */
31 
32 /*
33  * Convert (multi-)character constant to integer.
34  */
35 #define makecc(val,i)	lastcon = (lastcon<<8)|(val);
36 
37 /*
38  * Storage space requirements
39  */
40 #define SZCHAR		8
41 #define SZBOOL		8
42 #define SZINT		16
43 #define SZFLOAT		32
44 #define SZDOUBLE	64
45 #define SZLDOUBLE	64
46 #define SZLONG		32
47 #define SZSHORT		16
48 #define SZLONGLONG	64
49 #define SZPOINT(t)	16	/* Actually 15 */
50 
51 /*
52  * Alignment constraints
53  */
54 #define ALCHAR		8
55 #define ALBOOL		8
56 #define ALINT		16
57 #define ALFLOAT		16
58 #define ALDOUBLE	16
59 #define ALLDOUBLE	16
60 #define ALLONG		16
61 #define ALLONGLONG	16
62 #define ALSHORT		16
63 #define ALPOINT		16
64 #define ALSTRUCT	16
65 #define ALSTACK		16
66 
67 /*
68  * Min/max values.
69  */
70 #define	MIN_CHAR	-128
71 #define	MAX_CHAR	127
72 #define	MAX_UCHAR	255
73 #define	MIN_SHORT	-32768
74 #define	MAX_SHORT	32767
75 #define	MAX_USHORT	65535
76 #define	MIN_INT		MIN_SHORT
77 #define	MAX_INT		MAX_SHORT
78 #define	MAX_UNSIGNED	MAX_USHORT
79 #define	MIN_LONG	0x80000000L
80 #define	MAX_LONG	0x7fffffffL
81 #define	MAX_ULONG	0xffffffffUL
82 #define	MIN_LONGLONG	0x8000000000000000LL
83 #define	MAX_LONGLONG	0x7fffffffffffffffLL
84 #define	MAX_ULONGLONG	0xffffffffffffffffULL
85 
86 /* Default char is unsigned */
87 #define	CHAR_UNSIGNED
88 #define WORD_ADDRESSED
89 #define	BOOL_TYPE	UCHAR
90 #define	MYALIGN		/* provide private alignment function */
91 
92 /*
93  * Use large-enough types.
94  */
95 typedef	long CONSZ;
96 typedef	unsigned long U_CONSZ;
97 typedef long OFFSZ;
98 
99 #define CONFMT	"0%lo"		/* format for printing constants */
100 #define LABFMT	"L%d"		/* format for printing labels */
101 #define	STABLBL	"LL%d"		/* format for stab (debugging) labels */
102 
103 #define BACKAUTO 		/* stack grows negatively for automatics */
104 #define BACKTEMP 		/* stack grows negatively for temporaries */
105 #define ARGINIT		0	/* first arg at 0 offset */
106 #define AUTOINIT	32	/* first var below 32-bit offset */
107 
108 
109 #undef	FIELDOPS	/* no bit-field instructions */
110 #define TARGET_ENDIAN	TARGET_BE
111 
112 /* Definitions mostly used in pass2 */
113 
114 #define BYTEOFF(x)	((x)&01)
115 #define wdal(k)		(BYTEOFF(k)==0)
116 
117 #define	szty(t)	((t) == DOUBLE || (t) == LDOUBLE || \
118 	(t) == LONGLONG || (t) == ULONGLONG ? 4 : \
119 	((t) == LONG || (t) == ULONG || (t) == FLOAT) ? 2 : 1)
120 
121 /*
122  * The Nova has two register classes.  Note that the space used in
123  * zero page is considered stack.
124  * Register 6 and 7 are FP and SP (in zero page).
125  *
126  * The classes used on Nova are:
127  *	A - AC0-AC3 (as non-index registers)	: reg 0-3
128  *	B - AC2-AC3 (as index registers)	: reg 4-5
129  * FP/SP as 6/7.
130  */
131 #define	MAXREGS	8	/* 0-29 */
132 
133 #define	RSTATUS	\
134 	SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG,	\
135 	SBREG|TEMPREG, SBREG|TEMPREG, 0, 0
136 
137 #define	ROVERLAP \
138 	{ -1 }, { -1 }, { 4, -1 }, { 5, -1 }, { 2, -1 }, { 3, -1 },	\
139 	{ -1 }, { -1 }
140 
141 /* Return a register class based on the type of the node */
142 /* Used in tshape, avoid matching fp/sp as reg */
143 #define PCLASS(p) (p->n_op == REG && regno(p) > 5 ? 0 :	\
144 	ISPTR(p->n_type) ? SBREG : SAREG)
145 
146 #define	NUMCLASS 	2	/* highest number of reg classes used */
147 
148 int COLORMAP(int c, int *r);
149 #define	GCLASS(x) (x < 4 ? CLASSA : CLASSB)
150 #define DECRA(x,y)	(((x) >> (y*6)) & 63)	/* decode encoded regs */
151 #define	ENCRD(x)	(x)		/* Encode dest reg in n_reg */
152 #define ENCRA1(x)	((x) << 6)	/* A1 */
153 #define ENCRA2(x)	((x) << 12)	/* A2 */
154 #define ENCRA(x,y)	((x) << (6+y*6))	/* encode regs in int */
155 #define	RETREG(x)	(0) /* ? Sanity */
156 
157 #define FPREG	6	/* frame pointer */
158 #define STKREG	7	/* stack pointer */
159 
160 #define	MAXZP	030	/* number of locations used as stack */
161 #define	ZPOFF	050	/* offset of zero page regs */
162 
163 #define	MYSTOREMOD
164 #define	MYLONGTEMP(p,w) {					\
165 	if (w->r_class == 0) {					\
166 		w->r_color = freetemp(szty(p->n_type));		\
167 		w->r_class = FPREG;				\
168 	}							\
169 	if (w->r_color < MAXZP*2) { /* color in bytes */	\
170 		p->n_op = NAME;					\
171 		p->n_lval = w->r_color/2 + ZPOFF;		\
172 		p->n_name = "";					\
173 		break;						\
174 	}							\
175 }
176 
177 /*
178  * special shapes for sp/fp.
179  */
180 #define	SLDFPSP		(MAXSPECIAL+1)	/* load fp or sp */
181 #define NATIVE_FLOATING_POINT
182