2 * Copyright (c) 2008 David Crawshaw <david@zentus.com>
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.
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.
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.
24 #define SIMM13(val) (val < 4096 && val > -4097)
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.
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.
37 #define V9STEP(x) ALIGN(x, 0xf)
38 #define ALIGN(x, y) ((x & y) ? (x + y) & ~y : x)
41 #define makecc(val,i) lastcon = (lastcon<<8)|((val<<24)>>24);
43 #define ARGINIT (7*8) /* XXX */
76 #define MIN_SHORT -32768
77 #define MAX_SHORT 32767
78 #define MAX_USHORT 65535
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
91 typedef long long CONSZ
;
92 typedef unsigned long long U_CONSZ
;
93 typedef long long OFFSZ
;
97 #define STABLBL "LL%d"
99 #define BACKAUTO /* Stack grows negatively for automatics. */
100 #define BACKTEMP /* Stack grows negatively for temporaries. */
105 #define ENUMSIZE(high,low) INT
106 #define BYTEOFF(x) ((x)&03)
107 #define BITOOR(x) (x)
109 #define szty(t) ((ISPTR(t) || (t) == DOUBLE || \
110 (t) == LONG || (t) == ULONG || \
111 (t) == LONGLONG || (t) == ULONGLONG) ? 2 : 1)
114 /* Register names. */
116 #define MAXREGS (31 + 31 + 16 + 2)
206 #define RETREG(x) ((x)==DOUBLE ? D0 : (x)==FLOAT ? F1 : O0)
207 #define RETREG_PRE(x) ((x)==DOUBLE ? D0 : (x)==FLOAT ? F1 : I0)
211 SAREG|PERMREG, SAREG|PERMREG, SAREG|PERMREG, \
212 SAREG|PERMREG, SAREG|PERMREG, SAREG|PERMREG, SAREG|PERMREG, \
214 SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
215 SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
217 SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
218 SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
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, \
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 }, \
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))
266 int COLORMAP(int c
, int *r
);