/* $Id: macdefs.h,v 1.28 2007/11/17 00:19:43 gmcgarry Exp $ */
/*
* Copyright (c) 2003 Anders Magnusson (ragge@ludd.luth.se).
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* Machine-dependent defines for both passes.
*/
/*
* Convert (multi-)character constant to integer.
* Assume: If only one value; store at left side (char size), otherwise
* treat it as an integer.
*/
#define makecc(val,i) { \
if (i == 0) { lastcon = val; \
} else if (i == 1) { lastcon = (lastcon << 9) | val; lastcon <<= 18; \
} else { lastcon |= (val << (27 - (i * 9))); } }
#define ARGINIT 36 /* # bits below fp where arguments start */
#define AUTOINIT 36 /* # bits above fp where automatics start */
/*
* Storage space requirements
*/
#define SZCHAR 9
#define SZBOOL 36
#define SZINT 36
#define SZFLOAT 36
#define SZDOUBLE 72
#define SZLDOUBLE 72
#define SZLONG 36
#define SZSHORT 18
#define SZPOINT(x) 36
#define SZLONGLONG 72
/*
* Alignment constraints
*/
#define ALCHAR 9
#define ALBOOL 36
#define ALINT 36
#define ALFLOAT 36
#define ALDOUBLE 36
#define ALLDOUBLE 36
#define ALLONG 36
#define ALLONGLONG 36
#define ALSHORT 18
#define ALPOINT 36
#define ALSTRUCT 36
#define ALSTACK 36
/*
* Max values.
*/
#define MIN_CHAR -256
#define MAX_CHAR 255
#define MAX_UCHAR 511
#define MIN_SHORT -131072
#define MAX_SHORT 131071
#define MAX_USHORT 262143
#define MIN_INT (-0377777777777LL-1)
#define MAX_INT 0377777777777LL
#define MAX_UNSIGNED 0777777777777ULL
#define MIN_LONG (-0377777777777LL-1)
#define MAX_LONG 0377777777777LL
#define MAX_ULONG 0777777777777ULL
#define MIN_LONGLONG (000777777777777777777777LL-1) /* XXX cross */
#define MAX_LONGLONG 000777777777777777777777LL /* XXX cross */
#define MAX_ULONGLONG 001777777777777777777777ULL /* XXX cross */
/* Default char is unsigned */
#define TARGET_STDARGS
#define CHAR_UNSIGNED
#define WCHAR_TYPE INT /* what used to store wchar_t */
#define BOOL_TYPE INT
/*
* Use large-enough types.
*/
typedef long long CONSZ;
typedef unsigned long long U_CONSZ;
typedef long long OFFSZ;
#define CONFMT "0%llo" /* format for printing constants */
#define LABFMT ".L%d" /* format for printing labels */
#define STABLBL ".LL%d" /* format for stab (debugging) labels */
#undef BACKAUTO /* stack grows negatively for automatics */
#undef BACKTEMP /* stack grows negatively for temporaries */
#undef FIELDOPS /* no bit-field instructions */
#undef RTOLBYTES /* bytes are numbered left to right */
#define ENUMSIZE(high,low) INT /* enums are always stored in full int */
/* Definitions mostly used in pass2 */
#define BYTEOFF(x) ((x)&03)
#define wdal(k) (BYTEOFF(k)==0)
#define BITOOR(x) ((x)/36) /* bit offset to oreg offset */
#define STOARG(p)
#define STOFARG(p)
#define STOSTARG(p)
#define genfcall(a,b) gencall(a,b)
#define szty(t) (((t) == DOUBLE || (t) == FLOAT || \
(t) == LONGLONG || (t) == ULONGLONG) ? 2 : 1)
#define shltype(o, p) \
((o) == REG || (o) == NAME || (o) == ICON || \
(o) == OREG || ((o) == UMUL && shumul((p)->n_left)))
#undef SPECIAL_INTEGERS
/*
* Special shapes used in code generation.
*/
#define SUSHCON (SPECIAL|6) /* unsigned short constant */
#define SNSHCON (SPECIAL|7) /* negative short constant */
#define SILDB (SPECIAL|8) /* use ildb here */
/*
* Register allocator definitions.
*
* The pdp10 has 16 general-purpose registers, but the two
* highest are used as sp and fp. Register 0 has special
* constraints in its possible use as index register.
* All regs can be used as pairs, named by the lowest number.
* In here we call the registers Rn and the pairs XRn, in assembler
* just its number prefixed with %.
*
* R1/XR1 are return registers.
*
* R0 is currently not used.
*/
#define MAXREGS 29 /* 16 + 13 regs */
#define NUMCLASS 2
#define R0 00
#define R1 01
#define R2 02
#define R3 03
#define R4 04
#define R5 05
#define R6 06
#define R7 07
#define R10 010
#define R11 011
#define R12 012
#define R13 013
#define R14 014
#define R15 015
#define R16 016
#define R17 017
#define FPREG R16 /* frame pointer */
#define STKREG R17 /* stack pointer */
#define XR0 020
#define XR1 021
#define XR2 022
#define XR3 023
#define XR4 024
#define XR5 025
#define XR6 026
#define XR7 027
#define XR10 030
#define XR11 031
#define XR12 032
#define XR13 033
#define XR14 034
#define RSTATUS \
0, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, SAREG|TEMPREG, \
SAREG|PERMREG, SAREG|PERMREG, SAREG|PERMREG, SAREG|PERMREG, \
SAREG|PERMREG, SAREG|PERMREG, 0, 0, \
SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, SBREG, \
SBREG, SBREG, SBREG, SBREG, SBREG,
#define ROVERLAP \
{ XR0, -1 }, \
{ XR0, XR1, -1 }, \
{ XR1, XR2, -1 }, \
{ XR2, XR3, -1 }, \
{ XR3, XR4, -1 }, \
{ XR4, XR5, -1 }, \
{ XR5, XR6, -1 }, \
{ XR6, XR7, -1 }, \
{ XR7, XR10, -1 }, \
{ XR10, XR11, -1 }, \
{ XR11, XR12, -1 }, \
{ XR12, XR13, -1 }, \
{ XR13, XR14, -1 }, \
{ XR14, -1 }, \
{ -1 }, \
{ -1 }, \
{ R0, R1, XR1, -1 }, \
{ R1, R2, XR0, XR2, -1 }, \
{ R2, R3, XR1, XR3, -1 }, \
{ R3, R4, XR2, XR4, -1 }, \
{ R4, R5, XR3, XR5, -1 }, \
{ R5, R6, XR4, XR6, -1 }, \
{ R6, R7, XR5, XR7, -1 }, \
{ R7, R10, XR6, XR10, -1 }, \
{ R10, R11, XR7, XR11, -1 }, \
{ R11, R12, XR10, XR12, -1 }, \
{ R12, R13, XR11, XR13, -1 }, \
{ R13, R14, XR12, XR14, -1 }, \
{ R14, R15, XR13, -1 },
/* Return a register class based on the type of the node */
#define PCLASS(p) (szty(p->n_type) == 2 ? SBREG : SAREG)
#define RETREG(x) (szty(x) == 2 ? XR1 : R1)
#define DECRA(x,y) (((x) >> (y*6)) & 63) /* decode encoded regs */
#define ENCRD(x) (x) /* Encode dest reg in n_reg */
#define ENCRA1(x) ((x) << 6) /* A1 */
#define ENCRA2(x) ((x) << 12) /* A2 */
#define ENCRA(x,y) ((x) << (6+y*6)) /* encode regs in int */
#define GCLASS(x) (x < 16 ? CLASSA : CLASSB)
int COLORMAP(int c, int *r);
syntax highlighted by Code2HTML, v. 0.9.1