Logo Search packages:      
Sourcecode: pcc version File versions  Download package

macdefs.h

/*    $Id: macdefs.h,v 1.4 2009/01/24 21:43:49 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.
 */
#define makecc(val,i)   lastcon = i ? (val<<8)|lastcon : val

#define ARGINIT         32    /* # bits above r5 where arguments start */
#define AUTOINIT  64    /* # bits below r5 where automatics start */

/*
 * Storage space requirements
 */
#define SZCHAR          8
#define SZBOOL          8
#define SZINT           16
#define SZFLOAT         32
#define SZDOUBLE  64
#define SZLDOUBLE 64
#define SZLONG          32
#define SZSHORT         16
#define SZLONGLONG      64
#define SZPOINT(t)      16

/*
 * Alignment constraints
 */
#define ALCHAR          8
#define ALBOOL          8
#define ALINT           16
#define ALFLOAT         16
#define ALDOUBLE  16
#define ALLDOUBLE 16
#define ALLONG          16
#define ALLONGLONG      16
#define ALSHORT         16
#define ALPOINT         16
#define ALSTRUCT  16
#define ALSTACK         16 

/*
 * Min/max values.
 */
#define     MIN_CHAR    -128
#define     MAX_CHAR    127
#define     MAX_UCHAR   255
#define     MIN_SHORT   -32768
#define     MAX_SHORT   32767
#define     MAX_USHORT  65535
#define     MIN_INT           (-0x7fff-1)
#define     MAX_INT           0x7fff
#define     MAX_UNSIGNED      0xffff
#define     MIN_LONG    (-0x7fffffff-1)
#define     MAX_LONG    0x7fffffff
#define     MAX_ULONG   0xffffffff
#define     MIN_LONGLONG      0x8000000000000000LL
#define     MAX_LONGLONG      0x7fffffffffffffffLL
#define     MAX_ULONGLONG     0xffffffffffffffffULL

/* Default char is signed */
#undef      CHAR_UNSIGNED
#define     BOOL_TYPE   CHAR  /* what used to store _Bool */

/*
 * Use large-enough types.
 */
typedef     long long CONSZ;
typedef     unsigned long long U_CONSZ;
typedef long long OFFSZ;

#define CONFMT    "%lld"            /* format for printing constants */
#define LABFMT    "L%d"       /* format for printing labels */
#ifdef LANG_F77
#define BLANKCOMMON "_BLNK_"
#define MSKIREG  (M(TYSHORT)|M(TYLONG))
#define TYIREG TYLONG
#define FSZLENG  FSZLONG
#define     AUTOREG     EBP
#define     ARGREG      EBP
#define ARGOFFSET 8
#endif

#define BACKAUTO        /* stack grows negatively for automatics */
#define BACKTEMP        /* stack grows negatively for temporaries */

#undef      FIELDOPS          /* no bit-field instructions */
#define     RTOLBYTES         /* bytes are numbered right to left */

#define ENUMSIZE(high,low) INT      /* enums are always stored in full int */

/* Definitions mostly used in pass2 */

#define BYTEOFF(x)      ((x)&01)
#define wdal(k)         (BYTEOFF(k)==0)
#define BITOOR(x) (x)   /* bit offset to oreg offset XXX die! */

#define STOARG(p)
#define STOFARG(p)
#define STOSTARG(p)
#define genfcall(a,b)   gencall(a,b)

#define     FINDMOPS    /* pdp11 has instructions that modifies memory */

#define szty(t) ((t) == DOUBLE || (t) == LONGLONG || (t) == ULONGLONG ? 4 : \
      (t) == FLOAT || (t) == LONG || (t) == ULONG ? 2 : 1)

/*
 * The pdp11 has 3 register classes, 16-bit, 32-bit and floats.
 * Class membership and overlaps are defined in the macros RSTATUS
 * and ROVERLAP below.
 *
 * The classes used on pdp11 are:
 *    A - 16-bit
 *    B - 32-bit (concatenated 16-bit)
 *    C - floating point
 */
#define     R0    000   /* Scratch and return register */
#define     R1    001   /* Scratch and secondary return register */
#define     R2    002   /* Scratch register */
#define     R3    003   /* Scratch register */
#define     R4    004   /* Scratch register */
#define     R5    005   /* Frame pointer */
#define     SP    006   /* Stack pointer */
#define     PC    007   /* Program counter */

#define     R01   010
#define     R12   011
#define     R23   012
#define     R34   013

#define     FR0   020
#define     FR1   021
#define     FR2   022
#define     FR3   023
#define     FR4   024
#define     FR5   025
#define     FR6   026
#define     FR7   027

#define     MAXREGS     030   /* 24 registers */

#define     RSTATUS     \
      SAREG|TEMPREG, SAREG|TEMPREG, SAREG, SAREG, SAREG, 0, 0, 0, \
      SBREG, SBREG, SBREG, SBREG, 0, 0, 0, 0,         \
      SCREG, SCREG, SCREG, SCREG, 0, 0, 0, 0

#define     ROVERLAP \
      /* 8 basic registers */\
      { R01, -1 },            \
      { R01, R12, -1 }, \
      { R12, R23, -1 }, \
      { R23, R34, -1 }, \
      { R34, -1 },            \
      { -1 },                 \
      { -1 },                 \
      { -1 },                 \
\
      /* 4 long registers */\
      { R0, R1, R12, -1 },          \
      { R1, R2, R01, R23, -1 },           \
      { R2, R3, R12, R34, -1 },           \
      { R3, R4, R23, -1 },          \
      { -1 },                 \
      { -1 },                 \
      { -1 },                 \
      { -1 },                 \
\
      /* The fp registers do not overlap with anything */\
      { -1 },\
      { -1 },\
      { -1 },\
      { -1 },\
      { -1 },\
      { -1 },\
      { -1 },\
      { -1 },


/* Return a register class based on the type of the node */

#define PCLASS(p) (p->n_type < LONG || p->n_type > BTMASK ? SAREG : \
              (p->n_type == LONG || p->n_type == ULONG ? SBREG : SCREG))

#define     NUMCLASS    3     /* highest number of reg classes used */

int COLORMAP(int c, int *r);
#define     GCLASS(x) (x < 8 ? CLASSA : x < 16 ? CLASSB : CLASSC)
#define DECRA(x,y)      (((x) >> (y*5)) & 31)   /* decode encoded regs */
#define     ENCRD(x)    (x)         /* Encode dest reg in n_reg */
#define ENCRA1(x) ((x) << 5)  /* A1 */
#define ENCRA2(x) ((x) << 10) /* A2 */
#define ENCRA(x,y)      ((x) << (5+y*5))  /* encode regs in int */
#define     RETREG(x)   ((x) == LONG || (x) == ULONG ? R01 : \
      (x) == FLOAT || (x) == DOUBLE ? FR0 : R0)

//#define R2REGS  1     /* permit double indexing */

/* XXX - to die */
#define FPREG     R5    /* frame pointer */
#define STKREG    SP    /* stack pointer */

/* A bunch of specials to make life easier for pdp11 */
#define     SANDSCON    (MAXSPECIAL+1)
#define     SINCB       (MAXSPECIAL+2)    /* post-increment */
#define     SINCW       (MAXSPECIAL+3)    /* post-increment */
#define     SARGSUB           (MAXSPECIAL+4)    /* arg pointer to array */
#define     SARGINC           (MAXSPECIAL+5)    /* post-increment arg */

Generated by  Doxygen 1.6.0   Back to index