summaryrefslogtreecommitdiff
path: root/usr.bin/pcc/sparc64/macdefs.h
blob: 75e4fd0cb80828200db8053346c19aa8d0fcfc2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
/*	$OpenBSD: macdefs.h,v 1.2 2008/04/11 20:45:52 stefan Exp $	*/
/*
 * Copyright (c) 2008 David Crawshaw <david@zentus.com>
 * 
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */


/*
 * Many arithmetic instructions take 'reg_or_imm' in SPARCv9, where imm
 * means we can use a signed 13-bit constant (simm13). This gives us a
 * shortcut for small constants, instead of loading them into a register.
 * Special handling is required because 13 bits lies between SSCON and SCON.
 */
#define SIMM13(val) (val < 4096 && val > -4097)

/*
 * The SPARCv9 ABI specifies a stack bias of 2047 bits. This means that the
 * end of our call space is %fp+V9BIAS, working back towards %sp+V9BIAS+176.
 */
#define V9BIAS 2047

/*
 * The ABI requires that every frame reserve 176 bits for saving registers
 * in the case of a spill. The stack size must be 16-bit aligned.
 */
#define V9RESERVE 176
#define V9STEP(x) ALIGN(x, 0xf)
#define ALIGN(x, y) ((x & y) ? (x + y) & ~y : x)


#define makecc(val,i)	lastcon = (lastcon<<8)|((val<<24)>>24);

#define ARGINIT		(7*8) /* XXX */
#define AUTOINIT	(0)

/* Type sizes */
#define SZCHAR		8
#define SZBOOL		32
#define SZINT		32
#define SZFLOAT		32
#define SZDOUBLE	64
#define SZLDOUBLE	64
#define SZLONG		64
#define SZSHORT		16
#define SZLONGLONG	64
#define SZPOINT(t)	64

/* Type alignments */
#define ALCHAR		8
#define ALBOOL		32
#define ALINT		32
#define ALFLOAT		32
#define ALDOUBLE	64
#define ALLDOUBLE	64
#define ALLONG		64
#define ALLONGLONG	64
#define ALSHORT		16
#define ALPOINT		64
#define ALSTRUCT	32
#define ALSTACK		64

/* Min/max values. */
#define	MIN_CHAR	-128
#define	MAX_CHAR	127
#define	MAX_UCHAR	255
#define	MIN_SHORT	-32768
#define	MAX_SHORT	32767
#define	MAX_USHORT	65535
#define	MIN_INT		-1
#define	MAX_INT		0x7fffffff
#define	MAX_UNSIGNED	0xffffffff
#define	MIN_LONGLONG	0x8000000000000000LL
#define	MAX_LONGLONG	0x7fffffffffffffffLL
#define	MAX_ULONGLONG	0xffffffffffffffffULL
#define	MIN_LONG	MIN_LONGLONG
#define	MAX_LONG	MAX_LONGLONG
#define	MAX_ULONG	MAX_ULONGLONG

#define BOOL_TYPE	INT
#define WCHAR_TYPE	INT

typedef	long long CONSZ;
typedef	unsigned long long U_CONSZ;
typedef long long OFFSZ;

#define CONFMT	"%lld"
#define LABFMT  "L%d"
#define STABLBL "LL%d"

#define BACKAUTO 		/* Stack grows negatively for automatics. */
#define BACKTEMP 		/* Stack grows negatively for temporaries. */

#undef	FIELDOPS
#define RTOLBYTES

#define ENUMSIZE(high,low) INT
#define BYTEOFF(x) 	((x)&03)
#define BITOOR(x)	(x)

#define	szty(t)	((ISPTR(t) || (t) == DOUBLE || \
	         (t) == LONG || (t) == ULONG || \
	         (t) == LONGLONG || (t) == ULONGLONG) ? 2 : 1)


/* Register names. */

#define MAXREGS (31 + 31 + 16 + 2)
#define NUMCLASS 4

//define G0 	-1
#define G1 	0
#define G2 	1
#define G3 	2
#define G4 	3
#define G5 	4
#define G6 	5
#define G7 	6
#define O0 	7
#define O1 	8
#define O2 	9
#define O3 	10
#define O4 	11
#define O5 	12
#define O6 	13
#define O7 	14
#define L0 	15
#define L1 	16
#define L2 	17
#define L3 	18
#define L4 	19
#define L5 	20
#define L6 	21
#define L7 	22
#define I0 	23
#define I1 	24
#define I2 	25
#define I3 	26
#define I4 	27
#define I5 	28
#define I6 	29
#define I7 	30

#define F0 	31
#define F1 	32
#define F2 	33
#define F3 	34
#define F4 	35
#define F5 	36
#define F6 	37
#define F7 	38
#define F8 	39
#define F9 	40
#define F10	41
#define F11	42
#define F12	43
#define F13	44
#define F14	45
#define F15	46
#define F16	47
#define F17	48
#define F18	49
#define F19	50
#define F20	51
#define F21	52
#define F22	53
#define F23	54
#define F24	55
#define F25	56
#define F26	57
#define F27	58
#define F28	59
#define F29	60
#define F30	61
//define F31    XXX
#define D0	62
#define D1	63
#define D2	64
#define D3	65
#define D4	66
#define D5	67
#define D6	68
#define D7	69
#define D8	70
#define D9	71
#define D10	72
#define D11	73
#define D12	74
#define D13	75
#define D14	76
#define D15	77

#define SP 	78
#define FP 	79

#define FPREG 	FP

#define RETREG(x)	((x)==DOUBLE ? D0 : (x)==FLOAT ? F1 : O0)
#define RETREG_PRE(x)	((x)==DOUBLE ? D0 : (x)==FLOAT ? F1 : I0)

#define RSTATUS \
	/* global */ \
		               SAREG|PERMREG, SAREG|PERMREG, SAREG|PERMREG, \
		SAREG|PERMREG, SAREG|PERMREG, SAREG|PERMREG, SAREG|PERMREG, \
	/* out */ \
		SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
		SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
	/* local */ \
		SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
		SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
	/* in */ \
		SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
		SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
	/* 32-bit floating point */ \
		SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, \
		SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, \
		SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, \
		SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, /*, SBREG */ \
	/* 64-bit floating point */ \
		SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, \
		SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, \
	/* sp */ SDREG, \
	/* fp */ SDREG

#define ROVERLAP \
	        { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, \
	{ -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, \
	{ -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, \
	{ -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, \
/* 32-bit floating point */ \
	{  D0, -1 }, {  D0, -1 }, {  D1, -1 }, {  D1, -1 }, \
	{  D2, -1 }, {  D2, -1 }, {  D3, -1 }, {  D3, -1 }, \
	{  D4, -1 }, {  D4, -1 }, {  D5, -1 }, {  D5, -1 }, \
	{  D6, -1 }, {  D6, -1 }, {  D7, -1 }, {  D7, -1 }, \
	{  D8, -1 }, {  D8, -1 }, {  D9, -1 }, {  D9, -1 }, \
	{ D10, -1 }, { D10, -1 }, { D11, -1 }, { D11, -1 }, \
	{ D12, -1 }, { D12, -1 }, { D13, -1 }, { D13, -1 }, \
	{ D14, -1 }, { D14, -1 }, { D15, -1 }, /* { D15, -1 }, */ \
/* 64-bit floating point */ \
	{  F0,  F1, -1 }, {  F2,  F3, -1 }, {  F4,  F5, -1 }, \
	{  F6,  F7, -1 }, {  F8,  F9, -1 }, { F10, F11, -1 }, \
	{ F12, F13, -1 }, { F14, F15, -1 }, { F16, F17, -1 }, \
	{ F18, F19, -1 }, { F20, F21, -1 }, { F22, F23, -1 }, \
	{ F24, F25, -1 }, { F26, F27, -1 }, { F28, F29, -1 }, \
	{ F30, /* F31, */ -1 }, \
	{ -1 }, \
	{ -1 }

#define GCLASS(x) 	(x <= I7                ? CLASSA : \
			(x <= F30               ? CLASSB : \
			(x <= D15               ? CLASSC : \
			(x == SP || x == FP     ? CLASSD : 0))))
#define PCLASS(p)	(1 << gclass((p)->n_type))
#define DECRA(x,y)	(((x) >> (y*7)) & 127)
#define ENCRA(x,y)	((x) << (7+y*7))
#define ENCRD(x)	(x)

int COLORMAP(int c, int *r);