Home | History | Annotate | Line # | Download | only in sparc64
      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 (at) 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