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.
|
---|
15 | */
|
---|
16 |
|
---|
17 |
|
---|
18 | /*
|
---|
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.
|
---|
23 | */
|
---|
24 | #define SIMM13(val) (val < 4096 && val > -4097)
|
---|
25 |
|
---|
26 | /*
|
---|
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.
|
---|
29 | */
|
---|
30 | #define V9BIAS 2047
|
---|
31 |
|
---|
32 | /*
|
---|
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.
|
---|
35 | */
|
---|
36 | #define V9RESERVE 176
|
---|
37 | #define V9STEP(x) ALIGN(x, 0xf)
|
---|
38 | #define ALIGN(x, y) ((x & y) ? (x + y) & ~y : x)
|
---|
39 |
|
---|
40 |
|
---|
41 | #define makecc(val,i) lastcon = (lastcon<<8)|((val<<24)>>24);
|
---|
42 |
|
---|
43 | #define ARGINIT (7*8) /* XXX */
|
---|
44 | #define AUTOINIT (0)
|
---|
45 |
|
---|
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
|
---|
57 |
|
---|
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
|
---|
71 |
|
---|
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
|
---|
88 |
|
---|
89 | #define BOOL_TYPE INT
|
---|
90 |
|
---|
91 | typedef long long CONSZ;
|
---|
92 | typedef unsigned long long U_CONSZ;
|
---|
93 | typedef long long OFFSZ;
|
---|
94 |
|
---|
95 | #define CONFMT "%lld"
|
---|
96 | #define LABFMT "L%d"
|
---|
97 | #define STABLBL "LL%d"
|
---|
98 |
|
---|
99 | #define BACKAUTO /* Stack grows negatively for automatics. */
|
---|
100 | #define BACKTEMP /* Stack grows negatively for temporaries. */
|
---|
101 |
|
---|
102 | #undef FIELDOPS
|
---|
103 | #define RTOLBYTES
|
---|
104 |
|
---|
105 | #define ENUMSIZE(high,low) INT
|
---|
106 | #define BYTEOFF(x) ((x)&03)
|
---|
107 | #define BITOOR(x) (x)
|
---|
108 |
|
---|
109 | #define szty(t) ((ISPTR(t) || (t) == DOUBLE || \
|
---|
110 | (t) == LONG || (t) == ULONG || \
|
---|
111 | (t) == LONGLONG || (t) == ULONGLONG) ? 2 : 1)
|
---|
112 |
|
---|
113 |
|
---|
114 | /* Register names. */
|
---|
115 |
|
---|
116 | #define MAXREGS (31 + 31 + 16 + 2)
|
---|
117 | #define NUMCLASS 4
|
---|
118 |
|
---|
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
|
---|
151 |
|
---|
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
|
---|
200 |
|
---|
201 | #define SP 78
|
---|
202 | #define FP 79
|
---|
203 |
|
---|
204 | #define FPREG FP
|
---|
205 |
|
---|
206 | #define RETREG(x) ((x)==DOUBLE ? D0 : (x)==FLOAT ? F1 : O0)
|
---|
207 | #define RETREG_PRE(x) ((x)==DOUBLE ? D0 : (x)==FLOAT ? F1 : I0)
|
---|
208 |
|
---|
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
|
---|
232 |
|
---|
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 }
|
---|
256 |
|
---|
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)
|
---|
265 |
|
---|
266 | int COLORMAP(int c, int *r);
|
---|