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@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