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