1 /* $Id: macdefs.h,v 1.89 2014/06/01 11:35:02 ragge Exp $ */ 2 /* 3 * Copyright (c) 2003 Anders Magnusson (ragge@ludd.luth.se). 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. The name of the author may not be used to endorse or promote products 15 * derived from this software without specific prior written permission 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 /* 30 * Machine-dependent defines for both passes. 31 */ 32 33 /* 34 * Convert (multi-)character constant to integer. 35 */ 36 #define makecc(val,i) lastcon = (lastcon<<8)|((val<<24)>>24); 37 38 #define ARGINIT 64 /* # bits above fp where arguments start */ 39 #define AUTOINIT 0 /* # bits below fp where automatics start */ 40 41 /* 42 * Storage space requirements 43 */ 44 #define SZCHAR 8 45 #define SZBOOL 8 46 #define SZINT 32 47 #define SZFLOAT 32 48 #define SZDOUBLE 64 49 #ifdef MACHOABI 50 #define SZLDOUBLE 128 51 #else 52 #define SZLDOUBLE 96 53 #endif 54 #define SZLONG 32 55 #define SZSHORT 16 56 #define SZLONGLONG 64 57 #define SZPOINT(t) 32 58 59 /* 60 * Alignment constraints 61 */ 62 #define ALCHAR 8 63 #define ALBOOL 8 64 #define ALINT 32 65 #define ALFLOAT 32 66 #define ALDOUBLE 32 67 #ifdef MACHOABI 68 #define ALLDOUBLE 128 69 #else 70 #define ALLDOUBLE 32 71 #endif 72 #define ALLONG 32 73 #define ALLONGLONG 32 74 #define ALSHORT 16 75 #define ALPOINT 32 76 #undef ALSTRUCT /* Not defined if ELF ABI */ 77 #define ALSTACK 32 78 #define ALMAX 128 /* not yet supported type */ 79 80 /* 81 * Min/max values. 82 */ 83 #define MIN_CHAR -128 84 #define MAX_CHAR 127 85 #define MAX_UCHAR 255 86 #define MIN_SHORT -32768 87 #define MAX_SHORT 32767 88 #define MAX_USHORT 65535 89 #define MIN_INT (-0x7fffffff-1) 90 #define MAX_INT 0x7fffffff 91 #define MAX_UNSIGNED 0xffffffff 92 #define MIN_LONG MIN_INT 93 #define MAX_LONG MAX_INT 94 #define MAX_ULONG MAX_UNSIGNED 95 #define MIN_LONGLONG 0x8000000000000000LL 96 #define MAX_LONGLONG 0x7fffffffffffffffLL 97 #define MAX_ULONGLONG 0xffffffffffffffffULL 98 99 /* Default char is signed */ 100 #undef CHAR_UNSIGNED 101 #define BOOL_TYPE UCHAR /* what used to store _Bool */ 102 #undef UNALIGNED_ACCESS 103 /* 104 * Use large-enough types. 105 */ 106 typedef long long CONSZ; 107 typedef unsigned long long U_CONSZ; 108 typedef long long OFFSZ; 109 110 #define CONFMT "%lld" /* format for printing constants */ 111 #if defined(ELFABI) 112 #define LABFMT ".L%d" /* format for printing labels */ 113 #define STABLBL ".LL%d" /* format for stab (debugging) labels */ 114 #else 115 #define LABFMT "L%d" /* format for printing labels */ 116 #define STABLBL "LL%d" /* format for stab (debugging) labels */ 117 #endif 118 #ifdef LANG_F77 119 #define BLANKCOMMON "_BLNK_" 120 #define MSKIREG (M(TYSHORT)|M(TYLONG)) 121 #define TYIREG TYLONG 122 #define FSZLENG FSZLONG 123 #define AUTOREG EBP 124 #define ARGREG EBP 125 #define ARGOFFSET 8 126 #endif 127 128 #ifdef MACHOABI 129 #define STAB_LINE_ABSOLUTE /* S_LINE fields use absolute addresses */ 130 #define MYALIGN /* user power-of-2 alignment */ 131 #endif 132 133 #define BACKAUTO /* stack grows negatively for automatics */ 134 #define BACKTEMP /* stack grows negatively for temporaries */ 135 136 #undef FIELDOPS /* no bit-field instructions */ 137 #define TARGET_ENDIAN TARGET_LE 138 139 #define FINDMOPS /* i386 has instructions that modifies memory */ 140 #define CC_DIV_0 /* division by zero is safe in the compiler */ 141 142 /* Definitions mostly used in pass2 */ 143 144 #define BYTEOFF(x) ((x)&03) 145 #define wdal(k) (BYTEOFF(k)==0) 146 147 #define STOARG(p) 148 #define STOFARG(p) 149 #define STOSTARG(p) 150 #define genfcall(a,b) gencall(a,b) 151 152 #define szty(t) (((t) == DOUBLE || (t) == FLOAT || \ 153 (t) == LONGLONG || (t) == ULONGLONG) ? 2 : (t) == LDOUBLE ? 3 : 1) 154 155 /* 156 * The x86 has a bunch of register classes, most of them interfering 157 * with each other. All registers are given a sequential number to 158 * identify it which must match rnames[] in local2.c. 159 * Class membership and overlaps are defined in the macros RSTATUS 160 * and ROVERLAP below. 161 * 162 * The classes used on x86 are: 163 * A - short and int regs 164 * B - char regs 165 * C - long long regs 166 * D - floating point 167 */ 168 #define EAX 000 /* Scratch and return register */ 169 #define EDX 001 /* Scratch and secondary return register */ 170 #define ECX 002 /* Scratch (and shift count) register */ 171 #define EBX 003 /* GDT pointer or callee-saved temporary register */ 172 #define ESI 004 /* Callee-saved temporary register */ 173 #define EDI 005 /* Callee-saved temporary register */ 174 #define EBP 006 /* Frame pointer */ 175 #define ESP 007 /* Stack pointer */ 176 177 #define AL 010 178 #define AH 011 179 #define DL 012 180 #define DH 013 181 #define CL 014 182 #define CH 015 183 #define BL 016 184 #define BH 017 185 186 #define EAXEDX 020 187 #define EAXECX 021 188 #define EAXEBX 022 189 #define EAXESI 023 190 #define EAXEDI 024 191 #define EDXECX 025 192 #define EDXEBX 026 193 #define EDXESI 027 194 #define EDXEDI 030 195 #define ECXEBX 031 196 #define ECXESI 032 197 #define ECXEDI 033 198 #define EBXESI 034 199 #define EBXEDI 035 200 #define ESIEDI 036 201 202 /* The 8 math registers in class D lacks names */ 203 204 #define MAXREGS 047 /* 39 registers */ 205 206 #define RSTATUS \ 207 SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|PERMREG, \ 208 SAREG|PERMREG, SAREG|PERMREG, 0, 0, \ 209 SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, \ 210 SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, \ 211 SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, SCREG, \ 212 SDREG, SDREG, SDREG, SDREG, SDREG, SDREG, SDREG, SDREG, 213 214 #define ROVERLAP \ 215 /* 8 basic registers */\ 216 { AL, AH, EAXEDX, EAXECX, EAXEBX, EAXESI, EAXEDI, -1 },\ 217 { DL, DH, EAXEDX, EDXECX, EDXEBX, EDXESI, EDXEDI, -1 },\ 218 { CL, CH, EAXECX, EDXECX, ECXEBX, ECXESI, ECXEDI, -1 },\ 219 { BL, BH, EAXEBX, EDXEBX, ECXEBX, EBXESI, EBXEDI, -1 },\ 220 { EAXESI, EDXESI, ECXESI, EBXESI, ESIEDI, -1 },\ 221 { EAXEDI, EDXEDI, ECXEDI, EBXEDI, ESIEDI, -1 },\ 222 { -1 },\ 223 { -1 },\ 224 \ 225 /* 8 char registers */\ 226 { EAX, EAXEDX, EAXECX, EAXEBX, EAXESI, EAXEDI, -1 },\ 227 { EAX, EAXEDX, EAXECX, EAXEBX, EAXESI, EAXEDI, -1 },\ 228 { EDX, EAXEDX, EDXECX, EDXEBX, EDXESI, EDXEDI, -1 },\ 229 { EDX, EAXEDX, EDXECX, EDXEBX, EDXESI, EDXEDI, -1 },\ 230 { ECX, EAXECX, EDXECX, ECXEBX, ECXESI, ECXEDI, -1 },\ 231 { ECX, EAXECX, EDXECX, ECXEBX, ECXESI, ECXEDI, -1 },\ 232 { EBX, EAXEBX, EDXEBX, ECXEBX, EBXESI, EBXEDI, -1 },\ 233 { EBX, EAXEBX, EDXEBX, ECXEBX, EBXESI, EBXEDI, -1 },\ 234 \ 235 /* 15 long-long-emulating registers */\ 236 { EAX, AL, AH, EDX, DL, DH, EAXECX, EAXEBX, EAXESI, /* eaxedx */\ 237 EAXEDI, EDXECX, EDXEBX, EDXESI, EDXEDI, -1, },\ 238 { EAX, AL, AH, ECX, CL, CH, EAXEDX, EAXEBX, EAXESI, /* eaxecx */\ 239 EAXEDI, EDXECX, ECXEBX, ECXESI, ECXEDI, -1 },\ 240 { EAX, AL, AH, EBX, BL, BH, EAXEDX, EAXECX, EAXESI, /* eaxebx */\ 241 EAXEDI, EDXEBX, ECXEBX, EBXESI, EBXEDI, -1 },\ 242 { EAX, AL, AH, ESI, EAXEDX, EAXECX, EAXEBX, EAXEDI, /* eaxesi */\ 243 EDXESI, ECXESI, EBXESI, ESIEDI, -1 },\ 244 { EAX, AL, AH, EDI, EAXEDX, EAXECX, EAXEBX, EAXESI, /* eaxedi */\ 245 EDXEDI, ECXEDI, EBXEDI, ESIEDI, -1 },\ 246 { EDX, DL, DH, ECX, CL, CH, EAXEDX, EAXECX, EDXEBX, /* edxecx */\ 247 EDXESI, EDXEDI, ECXEBX, ECXESI, ECXEDI, -1 },\ 248 { EDX, DL, DH, EBX, BL, BH, EAXEDX, EDXECX, EDXESI, /* edxebx */\ 249 EDXEDI, EAXEBX, ECXEBX, EBXESI, EBXEDI, -1 },\ 250 { EDX, DL, DH, ESI, EAXEDX, EDXECX, EDXEBX, EDXEDI, /* edxesi */\ 251 EAXESI, ECXESI, EBXESI, ESIEDI, -1 },\ 252 { EDX, DL, DH, EDI, EAXEDX, EDXECX, EDXEBX, EDXESI, /* edxedi */\ 253 EAXEDI, ECXEDI, EBXEDI, ESIEDI, -1 },\ 254 { ECX, CL, CH, EBX, BL, BH, EAXECX, EDXECX, ECXESI, /* ecxebx */\ 255 ECXEDI, EAXEBX, EDXEBX, EBXESI, EBXEDI, -1 },\ 256 { ECX, CL, CH, ESI, EAXECX, EDXECX, ECXEBX, ECXEDI, /* ecxesi */\ 257 EAXESI, EDXESI, EBXESI, ESIEDI, -1 },\ 258 { ECX, CL, CH, EDI, EAXECX, EDXECX, ECXEBX, ECXESI, /* ecxedi */\ 259 EAXEDI, EDXEDI, EBXEDI, ESIEDI, -1 },\ 260 { EBX, BL, BH, ESI, EAXEBX, EDXEBX, ECXEBX, EBXEDI, /* ebxesi */\ 261 EAXESI, EDXESI, ECXESI, ESIEDI, -1 },\ 262 { EBX, BL, BH, EDI, EAXEBX, EDXEBX, ECXEBX, EBXESI, /* ebxedi */\ 263 EAXEDI, EDXEDI, ECXEDI, ESIEDI, -1 },\ 264 { ESI, EDI, EAXESI, EDXESI, ECXESI, EBXESI, /* esiedi */\ 265 EAXEDI, EDXEDI, ECXEDI, EBXEDI, -1 },\ 266 \ 267 /* The fp registers do not overlap with anything */\ 268 { -1 },\ 269 { -1 },\ 270 { -1 },\ 271 { -1 },\ 272 { -1 },\ 273 { -1 },\ 274 { -1 },\ 275 { -1 }, 276 277 278 /* Return a register class based on the type of the node */ 279 #define PCLASS(p) (p->n_type <= UCHAR ? SBREG : \ 280 (p->n_type == LONGLONG || p->n_type == ULONGLONG ? SCREG : \ 281 (p->n_type >= FLOAT && p->n_type <= LDOUBLE ? SDREG : SAREG))) 282 283 #define NUMCLASS 4 /* highest number of reg classes used */ 284 285 int COLORMAP(int c, int *r); 286 #define GCLASS(x) (x < 8 ? CLASSA : x < 16 ? CLASSB : x < 31 ? CLASSC : CLASSD) 287 #define DECRA(x,y) (((x) >> (y*6)) & 63) /* decode encoded regs */ 288 #define ENCRD(x) (x) /* Encode dest reg in n_reg */ 289 #define ENCRA1(x) ((x) << 6) /* A1 */ 290 #define ENCRA2(x) ((x) << 12) /* A2 */ 291 #define ENCRA(x,y) ((x) << (6+y*6)) /* encode regs in int */ 292 /* XXX - return char in al? */ 293 #define RETREG(x) (x == CHAR || x == UCHAR ? AL : \ 294 x == LONGLONG || x == ULONGLONG ? EAXEDX : \ 295 x == FLOAT || x == DOUBLE || x == LDOUBLE ? 31 : EAX) 296 297 #if 0 298 #define R2REGS 1 /* permit double indexing */ 299 #endif 300 301 /* XXX - to die */ 302 #define FPREG EBP /* frame pointer */ 303 #define STKREG ESP /* stack pointer */ 304 305 #define SHSTR (MAXSPECIAL+1) /* short struct */ 306 #define SFUNCALL (MAXSPECIAL+2) /* struct assign after function call */ 307 #define SPCON (MAXSPECIAL+3) /* positive nonnamed constant */ 308 309 /* 310 * Specials that indicate the applicability of machine idioms. 311 */ 312 #define SMIXOR (MAXSPECIAL+4) 313 #define SMILWXOR (MAXSPECIAL+5) 314 #define SMIHWXOR (MAXSPECIAL+6) 315 316 /* 317 * i386-specific symbol table flags. 318 */ 319 #define SSECTION SLOCAL1 320 #define SSTDCALL SLOCAL2 321 #define SDLLINDIRECT SLOCAL3 322 323 /* 324 * i386-specific node flags. 325 */ 326 #define FSTDCALL NLOCAL1 327 #define FFPPOP NLOCAL2 328 329 /* 330 * i386-specific interpass stuff. 331 */ 332 333 #define TARGET_IPP_MEMBERS \ 334 int ipp_argstacksize; 335 336 #define HAVE_WEAKREF 337 #define TARGET_FLT_EVAL_METHOD 2 /* all as long double */ 338 339 /* 340 * Extended assembler macros. 341 */ 342 void targarg(char *w, void *arg); 343 #define XASM_TARGARG(w, ary) \ 344 (w[1] == 'b' || w[1] == 'h' || w[1] == 'w' || w[1] == 'k' ? \ 345 w++, targarg(w, ary), 1 : 0) 346 int numconv(void *ip, void *p, void *q); 347 #define XASM_NUMCONV(ip, p, q) numconv(ip, p, q) 348 int xasmconstregs(char *); 349 #define XASMCONSTREGS(x) xasmconstregs(x) 350 #define MYSETXARG if (XASMVAL(cw) == 'q') { \ 351 c = 'r'; addalledges(&ablock[ESI]); addalledges(&ablock[EDI]); } 352 353 #if defined(MACHOABI) 354 struct stub { 355 struct { struct stub *q_forw, *q_back; } link; 356 char *name; 357 }; 358 extern struct stub stublist; 359 extern struct stub nlplist; 360 void addstub(struct stub *list, char *name); 361 #endif 362