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