1*6935091cSplunky /*	Id: macdefs.h,v 1.17 2015/11/24 17:35:12 ragge Exp 	*/
2*6935091cSplunky /*	$NetBSD: macdefs.h,v 1.1.1.5 2016/02/09 20:28:32 plunky Exp $	*/
3a301e773Splunky 
46e0bca22Sgmcgarry /*
56e0bca22Sgmcgarry  * Copyright (c) 2008 David Crawshaw <david@zentus.com>
66e0bca22Sgmcgarry  *
76e0bca22Sgmcgarry  * Permission to use, copy, modify, and/or distribute this software for any
86e0bca22Sgmcgarry  * purpose with or without fee is hereby granted, provided that the above
96e0bca22Sgmcgarry  * copyright notice and this permission notice appear in all copies.
106e0bca22Sgmcgarry  *
116e0bca22Sgmcgarry  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
126e0bca22Sgmcgarry  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
136e0bca22Sgmcgarry  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
146e0bca22Sgmcgarry  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
156e0bca22Sgmcgarry  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
166e0bca22Sgmcgarry  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
176e0bca22Sgmcgarry  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
186e0bca22Sgmcgarry  */
196e0bca22Sgmcgarry 
206e0bca22Sgmcgarry 
216e0bca22Sgmcgarry /*
226e0bca22Sgmcgarry  * Many arithmetic instructions take 'reg_or_imm' in SPARCv9, where imm
236e0bca22Sgmcgarry  * means we can use a signed 13-bit constant (simm13). This gives us a
246e0bca22Sgmcgarry  * shortcut for small constants, instead of loading them into a register.
256e0bca22Sgmcgarry  * Special handling is required because 13 bits lies between SSCON and SCON.
266e0bca22Sgmcgarry  */
276e0bca22Sgmcgarry #define SIMM13(val) (val < 4096 && val > -4097)
286e0bca22Sgmcgarry 
296e0bca22Sgmcgarry /*
306e0bca22Sgmcgarry  * The SPARCv9 ABI specifies a stack bias of 2047 bits. This means that the
316e0bca22Sgmcgarry  * end of our call space is %fp+V9BIAS, working back towards %sp+V9BIAS+176.
326e0bca22Sgmcgarry  */
336e0bca22Sgmcgarry #define V9BIAS 2047
346e0bca22Sgmcgarry 
356e0bca22Sgmcgarry /*
366e0bca22Sgmcgarry  * The ABI requires that every frame reserve 176 bits for saving registers
376e0bca22Sgmcgarry  * in the case of a spill. The stack size must be 16-bit aligned.
386e0bca22Sgmcgarry  */
396e0bca22Sgmcgarry #define V9RESERVE 176
406e0bca22Sgmcgarry #define V9STEP(x) ALIGN(x, 0xf)
416e0bca22Sgmcgarry #define ALIGN(x, y) ((x & y) ? (x + y) & ~y : x)
426e0bca22Sgmcgarry 
436e0bca22Sgmcgarry 
446e0bca22Sgmcgarry #define makecc(val,i)	lastcon = (lastcon<<8)|((val<<24)>>24);
456e0bca22Sgmcgarry 
466e0bca22Sgmcgarry #define ARGINIT		(7*8) /* XXX */
476e0bca22Sgmcgarry #define AUTOINIT	(0)
486e0bca22Sgmcgarry 
496e0bca22Sgmcgarry /* Type sizes */
506e0bca22Sgmcgarry #define SZCHAR		8
516e0bca22Sgmcgarry #define SZBOOL		32
526e0bca22Sgmcgarry #define SZINT		32
536e0bca22Sgmcgarry #define SZFLOAT		32
546e0bca22Sgmcgarry #define SZDOUBLE	64
556e0bca22Sgmcgarry #define SZLDOUBLE	64
566e0bca22Sgmcgarry #define SZLONG		64
576e0bca22Sgmcgarry #define SZSHORT		16
586e0bca22Sgmcgarry #define SZLONGLONG	64
596e0bca22Sgmcgarry #define SZPOINT(t)	64
606e0bca22Sgmcgarry 
616e0bca22Sgmcgarry /* Type alignments */
626e0bca22Sgmcgarry #define ALCHAR		8
636e0bca22Sgmcgarry #define ALBOOL		32
646e0bca22Sgmcgarry #define ALINT		32
656e0bca22Sgmcgarry #define ALFLOAT		32
666e0bca22Sgmcgarry #define ALDOUBLE	64
676e0bca22Sgmcgarry #define ALLDOUBLE	64
686e0bca22Sgmcgarry #define ALLONG		64
696e0bca22Sgmcgarry #define ALLONGLONG	64
706e0bca22Sgmcgarry #define ALSHORT		16
716e0bca22Sgmcgarry #define ALPOINT		64
726e0bca22Sgmcgarry #define ALSTRUCT	32
736e0bca22Sgmcgarry #define ALSTACK		64
746e0bca22Sgmcgarry 
756e0bca22Sgmcgarry /* Min/max values. */
766e0bca22Sgmcgarry #define	MIN_CHAR	-128
776e0bca22Sgmcgarry #define	MAX_CHAR	127
786e0bca22Sgmcgarry #define	MAX_UCHAR	255
796e0bca22Sgmcgarry #define	MIN_SHORT	-32768
806e0bca22Sgmcgarry #define	MAX_SHORT	32767
816e0bca22Sgmcgarry #define	MAX_USHORT	65535
826e0bca22Sgmcgarry #define	MIN_INT		-1
836e0bca22Sgmcgarry #define	MAX_INT		0x7fffffff
846e0bca22Sgmcgarry #define	MAX_UNSIGNED	0xffffffff
856e0bca22Sgmcgarry #define	MIN_LONGLONG	0x8000000000000000LL
866e0bca22Sgmcgarry #define	MAX_LONGLONG	0x7fffffffffffffffLL
876e0bca22Sgmcgarry #define	MAX_ULONGLONG	0xffffffffffffffffULL
886e0bca22Sgmcgarry #define	MIN_LONG	MIN_LONGLONG
896e0bca22Sgmcgarry #define	MAX_LONG	MAX_LONGLONG
906e0bca22Sgmcgarry #define	MAX_ULONG	MAX_ULONGLONG
916e0bca22Sgmcgarry 
926e0bca22Sgmcgarry #define BOOL_TYPE	INT
936e0bca22Sgmcgarry 
946e0bca22Sgmcgarry typedef	long long CONSZ;
956e0bca22Sgmcgarry typedef	unsigned long long U_CONSZ;
966e0bca22Sgmcgarry typedef long long OFFSZ;
976e0bca22Sgmcgarry 
986e0bca22Sgmcgarry #define CONFMT	"%lld"
996e0bca22Sgmcgarry #define LABFMT  "L%d"
1006e0bca22Sgmcgarry #define STABLBL "LL%d"
1016e0bca22Sgmcgarry 
1026e0bca22Sgmcgarry #define BACKAUTO 		/* Stack grows negatively for automatics. */
1036e0bca22Sgmcgarry #define BACKTEMP 		/* Stack grows negatively for temporaries. */
1046e0bca22Sgmcgarry 
1056e0bca22Sgmcgarry #undef	FIELDOPS
106a301e773Splunky #define TARGET_ENDIAN TARGET_BE
1076e0bca22Sgmcgarry 
1086e0bca22Sgmcgarry #define BYTEOFF(x) 	((x)&03)
1096e0bca22Sgmcgarry 
1106e0bca22Sgmcgarry #define	szty(t)	((ISPTR(t) || (t) == DOUBLE || \
1116e0bca22Sgmcgarry 	         (t) == LONG || (t) == ULONG || \
1126e0bca22Sgmcgarry 	         (t) == LONGLONG || (t) == ULONGLONG) ? 2 : 1)
1136e0bca22Sgmcgarry 
1146e0bca22Sgmcgarry 
1156e0bca22Sgmcgarry /* Register names. */
1166e0bca22Sgmcgarry 
1176e0bca22Sgmcgarry #define MAXREGS (31 + 31 + 16 + 2)
1186e0bca22Sgmcgarry #define NUMCLASS 4
1196e0bca22Sgmcgarry 
1206e0bca22Sgmcgarry //define G0 	-1
1216e0bca22Sgmcgarry #define G1 	0
1226e0bca22Sgmcgarry #define G2 	1
1236e0bca22Sgmcgarry #define G3 	2
1246e0bca22Sgmcgarry #define G4 	3
1256e0bca22Sgmcgarry #define G5 	4
1266e0bca22Sgmcgarry #define G6 	5
1276e0bca22Sgmcgarry #define G7 	6
1286e0bca22Sgmcgarry #define O0 	7
1296e0bca22Sgmcgarry #define O1 	8
1306e0bca22Sgmcgarry #define O2 	9
1316e0bca22Sgmcgarry #define O3 	10
1326e0bca22Sgmcgarry #define O4 	11
1336e0bca22Sgmcgarry #define O5 	12
1346e0bca22Sgmcgarry #define O6 	13
1356e0bca22Sgmcgarry #define O7 	14
1366e0bca22Sgmcgarry #define L0 	15
1376e0bca22Sgmcgarry #define L1 	16
1386e0bca22Sgmcgarry #define L2 	17
1396e0bca22Sgmcgarry #define L3 	18
1406e0bca22Sgmcgarry #define L4 	19
1416e0bca22Sgmcgarry #define L5 	20
1426e0bca22Sgmcgarry #define L6 	21
1436e0bca22Sgmcgarry #define L7 	22
1446e0bca22Sgmcgarry #define I0 	23
1456e0bca22Sgmcgarry #define I1 	24
1466e0bca22Sgmcgarry #define I2 	25
1476e0bca22Sgmcgarry #define I3 	26
1486e0bca22Sgmcgarry #define I4 	27
1496e0bca22Sgmcgarry #define I5 	28
1506e0bca22Sgmcgarry #define I6 	29
1516e0bca22Sgmcgarry #define I7 	30
1526e0bca22Sgmcgarry 
1536e0bca22Sgmcgarry #define F0 	31
1546e0bca22Sgmcgarry #define F1 	32
1556e0bca22Sgmcgarry #define F2 	33
1566e0bca22Sgmcgarry #define F3 	34
1576e0bca22Sgmcgarry #define F4 	35
1586e0bca22Sgmcgarry #define F5 	36
1596e0bca22Sgmcgarry #define F6 	37
1606e0bca22Sgmcgarry #define F7 	38
1616e0bca22Sgmcgarry #define F8 	39
1626e0bca22Sgmcgarry #define F9 	40
1636e0bca22Sgmcgarry #define F10	41
1646e0bca22Sgmcgarry #define F11	42
1656e0bca22Sgmcgarry #define F12	43
1666e0bca22Sgmcgarry #define F13	44
1676e0bca22Sgmcgarry #define F14	45
1686e0bca22Sgmcgarry #define F15	46
1696e0bca22Sgmcgarry #define F16	47
1706e0bca22Sgmcgarry #define F17	48
1716e0bca22Sgmcgarry #define F18	49
1726e0bca22Sgmcgarry #define F19	50
1736e0bca22Sgmcgarry #define F20	51
1746e0bca22Sgmcgarry #define F21	52
1756e0bca22Sgmcgarry #define F22	53
1766e0bca22Sgmcgarry #define F23	54
1776e0bca22Sgmcgarry #define F24	55
1786e0bca22Sgmcgarry #define F25	56
1796e0bca22Sgmcgarry #define F26	57
1806e0bca22Sgmcgarry #define F27	58
1816e0bca22Sgmcgarry #define F28	59
1826e0bca22Sgmcgarry #define F29	60
1836e0bca22Sgmcgarry #define F30	61
1846e0bca22Sgmcgarry //define F31    XXX
1856e0bca22Sgmcgarry #define D0	62
1866e0bca22Sgmcgarry #define D1	63
1876e0bca22Sgmcgarry #define D2	64
1886e0bca22Sgmcgarry #define D3	65
1896e0bca22Sgmcgarry #define D4	66
1906e0bca22Sgmcgarry #define D5	67
1916e0bca22Sgmcgarry #define D6	68
1926e0bca22Sgmcgarry #define D7	69
1936e0bca22Sgmcgarry #define D8	70
1946e0bca22Sgmcgarry #define D9	71
1956e0bca22Sgmcgarry #define D10	72
1966e0bca22Sgmcgarry #define D11	73
1976e0bca22Sgmcgarry #define D12	74
1986e0bca22Sgmcgarry #define D13	75
1996e0bca22Sgmcgarry #define D14	76
2006e0bca22Sgmcgarry #define D15	77
2016e0bca22Sgmcgarry 
2026e0bca22Sgmcgarry #define SP 	78
2036e0bca22Sgmcgarry #define FP 	79
2046e0bca22Sgmcgarry 
2056e0bca22Sgmcgarry #define FPREG 	FP
2066e0bca22Sgmcgarry 
2076e0bca22Sgmcgarry #define RETREG(x)	((x)==DOUBLE ? D0 : (x)==FLOAT ? F1 : O0)
2086e0bca22Sgmcgarry #define RETREG_PRE(x)	((x)==DOUBLE ? D0 : (x)==FLOAT ? F1 : I0)
2096e0bca22Sgmcgarry 
2106e0bca22Sgmcgarry #define RSTATUS \
2116e0bca22Sgmcgarry 	/* global */ \
2126e0bca22Sgmcgarry 		               SAREG|PERMREG, SAREG|PERMREG, SAREG|PERMREG, \
2136e0bca22Sgmcgarry 		SAREG|PERMREG, SAREG|PERMREG, SAREG|PERMREG, SAREG|PERMREG, \
2146e0bca22Sgmcgarry 	/* out */ \
2156e0bca22Sgmcgarry 		SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
2166e0bca22Sgmcgarry 		SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
2176e0bca22Sgmcgarry 	/* local */ \
2186e0bca22Sgmcgarry 		SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
2196e0bca22Sgmcgarry 		SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
2206e0bca22Sgmcgarry 	/* in */ \
2216e0bca22Sgmcgarry 		SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
2226e0bca22Sgmcgarry 		SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
2236e0bca22Sgmcgarry 	/* 32-bit floating point */ \
2246e0bca22Sgmcgarry 		SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, \
2256e0bca22Sgmcgarry 		SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, \
2266e0bca22Sgmcgarry 		SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, \
2276e0bca22Sgmcgarry 		SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, /*, SBREG */ \
2286e0bca22Sgmcgarry 	/* 64-bit floating point */ \
2296e0bca22Sgmcgarry 		SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, \
2306e0bca22Sgmcgarry 		SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, \
2316e0bca22Sgmcgarry 	/* sp */ SDREG, \
2326e0bca22Sgmcgarry 	/* fp */ SDREG
2336e0bca22Sgmcgarry 
2346e0bca22Sgmcgarry #define ROVERLAP \
2356e0bca22Sgmcgarry 	        { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, \
2366e0bca22Sgmcgarry 	{ -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, \
2376e0bca22Sgmcgarry 	{ -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, \
2386e0bca22Sgmcgarry 	{ -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, \
2396e0bca22Sgmcgarry /* 32-bit floating point */ \
2406e0bca22Sgmcgarry 	{  D0, -1 }, {  D0, -1 }, {  D1, -1 }, {  D1, -1 }, \
2416e0bca22Sgmcgarry 	{  D2, -1 }, {  D2, -1 }, {  D3, -1 }, {  D3, -1 }, \
2426e0bca22Sgmcgarry 	{  D4, -1 }, {  D4, -1 }, {  D5, -1 }, {  D5, -1 }, \
2436e0bca22Sgmcgarry 	{  D6, -1 }, {  D6, -1 }, {  D7, -1 }, {  D7, -1 }, \
2446e0bca22Sgmcgarry 	{  D8, -1 }, {  D8, -1 }, {  D9, -1 }, {  D9, -1 }, \
2456e0bca22Sgmcgarry 	{ D10, -1 }, { D10, -1 }, { D11, -1 }, { D11, -1 }, \
2466e0bca22Sgmcgarry 	{ D12, -1 }, { D12, -1 }, { D13, -1 }, { D13, -1 }, \
2476e0bca22Sgmcgarry 	{ D14, -1 }, { D14, -1 }, { D15, -1 }, /* { D15, -1 }, */ \
2486e0bca22Sgmcgarry /* 64-bit floating point */ \
2496e0bca22Sgmcgarry 	{  F0,  F1, -1 }, {  F2,  F3, -1 }, {  F4,  F5, -1 }, \
2506e0bca22Sgmcgarry 	{  F6,  F7, -1 }, {  F8,  F9, -1 }, { F10, F11, -1 }, \
2516e0bca22Sgmcgarry 	{ F12, F13, -1 }, { F14, F15, -1 }, { F16, F17, -1 }, \
2526e0bca22Sgmcgarry 	{ F18, F19, -1 }, { F20, F21, -1 }, { F22, F23, -1 }, \
2536e0bca22Sgmcgarry 	{ F24, F25, -1 }, { F26, F27, -1 }, { F28, F29, -1 }, \
2546e0bca22Sgmcgarry 	{ F30, /* F31, */ -1 }, \
2556e0bca22Sgmcgarry 	{ -1 }, \
2566e0bca22Sgmcgarry 	{ -1 }
2576e0bca22Sgmcgarry 
2586e0bca22Sgmcgarry #define GCLASS(x) 	(x <= I7                ? CLASSA : \
2596e0bca22Sgmcgarry 			(x <= F30               ? CLASSB : \
2606e0bca22Sgmcgarry 			(x <= D15               ? CLASSC : \
2616e0bca22Sgmcgarry 			(x == SP || x == FP     ? CLASSD : 0))))
2626e0bca22Sgmcgarry #define PCLASS(p)	(1 << gclass((p)->n_type))
2636e0bca22Sgmcgarry #define DECRA(x,y)	(((x) >> (y*7)) & 127)
2646e0bca22Sgmcgarry #define ENCRA(x,y)	((x) << (7+y*7))
2656e0bca22Sgmcgarry #define ENCRD(x)	(x)
2666e0bca22Sgmcgarry 
2676e0bca22Sgmcgarry int COLORMAP(int c, int *r);
268*6935091cSplunky #define NATIVE_FLOATING_POINT
269