Annotation of GNUtools/cc/config/sh/sh.h, revision 1.1

1.1     ! root        1: /* Definitions of target machine for GNU compiler, for Hitachi Super-H.
        !             2:    Copyright (C) 1993 Free Software Foundation, Inc.
        !             3: 
        !             4:    Contributed by Steve Chamberlain ([email protected])
        !             5: 
        !             6: This file is part of GNU CC.
        !             7: 
        !             8: GNU CC is free software; you can redistribute it and/or modify
        !             9: it under the terms of the GNU General Public License as published by
        !            10: the Free Software Foundation; either version 2, or (at your option)
        !            11: any later version.
        !            12: 
        !            13: GNU CC is distributed in the hope that it will be useful,
        !            14: but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            16: GNU General Public License for more details.
        !            17: 
        !            18: You should have received a copy of the GNU General Public License
        !            19: along with GNU CC; see the file COPYING.  If not, write to
        !            20: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
        !            21: 
        !            22: 
        !            23: /* Run-time Target Specification.  */
        !            24: #define TARGET_SH
        !            25: 
        !            26: #define TARGET_VERSION  \
        !            27:   fputs (" (Hitachi SH)", stderr);
        !            28: 
        !            29: /* Generate SDB debugging information.  */
        !            30: 
        !            31: #define SDB_DEBUGGING_INFO  1
        !            32: 
        !            33: #define SDB_DELIM ";"
        !            34: 
        !            35: #define CPP_PREDEFINES "-D__sh__ -Acpu(sh) -Amachine(sh)"
        !            36: 
        !            37: 
        !            38: /* Omitting the frame pointer is a very good idea on the SH */
        !            39: 
        !            40: #define OPTIMIZATION_OPTIONS(OPTIMIZE)  \
        !            41: {                                      \
        !            42:   if (OPTIMIZE)                                \
        !            43:     flag_omit_frame_pointer = 1;       \
        !            44:    if (OPTIMIZE==0)OPTIMIZE=1;         \
        !            45: }
        !            46: 
        !            47: /* Run-time compilation parameters selecting different hardware subsets. */
        !            48: 
        !            49: extern int target_flags;
        !            50: #define ISIZE_BIT  1
        !            51: #define FAST_BIT   2
        !            52: 
        !            53: #define MAC_BIT    8
        !            54: #define RTL_BIT    16
        !            55: #define DT_BIT     32
        !            56: #define DALIGN_BIT 64
        !            57: #define SH0_BIT        128
        !            58: #define SH1_BIT        256
        !            59: #define SH2_BIT        512
        !            60: #define SH3_BIT        1024
        !            61: #define C_BIT  2048
        !            62: #define R_BIT     (1<<12)
        !            63: #define SPACE_BIT (1<<13)
        !            64: 
        !            65: /* Nonzero if we should generate code using type 0 insns */
        !            66: #define TARGET_SH0 (target_flags & SH0_BIT)
        !            67: 
        !            68: /* Nonzero if we should generate code using type 1 insns */
        !            69: #define TARGET_SH1 (target_flags & SH1_BIT)
        !            70: 
        !            71: /* Nonzero if we should generate code using type 2 insns */
        !            72: #define TARGET_SH2 (target_flags & SH2_BIT)
        !            73: 
        !            74: /* Nonzero if we should generate code using type 3 insns */
        !            75: #define TARGET_SH3 (target_flags & SH3_BIT)
        !            76: 
        !            77: /* Nonzero if we should generate faster code rather than smaller code */
        !            78: #define TARGET_FASTCODE   (target_flags & FAST_BIT)
        !            79: 
        !            80: /* Nonzero if we should generate faster code rather than smaller code */
        !            81: #define TARGET_SMALLCODE   (target_flags & SPACE_BIT)
        !            82: 
        !            83: /* Nonzero if we should dump out instruction size info */
        !            84: #define TARGET_DUMPISIZE  (target_flags & ISIZE_BIT)
        !            85: 
        !            86: /* Nonzero if we should try to generate mac instructions */
        !            87: #define TARGET_MAC        (target_flags & MAC_BIT)
        !            88: 
        !            89: /* Nonzero if we should dump the rtl in the assembly file. */
        !            90: #define TARGET_DUMP_RTL          (target_flags & RTL_BIT)
        !            91: 
        !            92: /* Nonzero if we should dump the rtl somewher else. */
        !            93: #define TARGET_DUMP_R    (target_flags & R_BIT)
        !            94: 
        !            95: /* Nonzero to align doubles on 64 bit boundaries */
        !            96: #define TARGET_ALIGN_DOUBLE (target_flags & DALIGN_BIT)
        !            97: 
        !            98: 
        !            99: /* Nonzero if Combine dumping wanted */
        !           100: #define TARGET_CDUMP (target_flags & C_BIT)
        !           101: 
        !           102: #define TARGET_SWITCHES        \
        !           103: { {"isize",    ( ISIZE_BIT)  },\
        !           104:   {"space",    ( SPACE_BIT)   },\
        !           105:   {"0",                ( SH0_BIT) },\
        !           106:   {"1",                ( SH1_BIT) },\
        !           107:   {"2",                ( SH2_BIT) },\
        !           108:   {"3",                ( SH3_BIT) },\
        !           109:   {"ac",       ( MAC_BIT)    },\
        !           110:   {"dalign",   ( DALIGN_BIT) },\
        !           111:   {"c",        ( C_BIT) },\
        !           112:   {"r",        ( RTL_BIT) },\
        !           113:   {"R",        ( R_BIT) },\
        !           114:   {"",         TARGET_DEFAULT} \
        !           115: }
        !           116: 
        !           117: #define TARGET_DEFAULT  FAST_BIT
        !           118: 
        !           119: #define OVERRIDE_OPTIONS override_options();
        !           120: 
        !           121: 
        !           122: /* Target machine storage Layout.  */
        !           123: 
        !           124: /* Define to use software floating point emulator for REAL_ARITHMETIC and
        !           125:    decimal <-> binary conversion. */
        !           126: #define REAL_ARITHMETIC
        !           127: 
        !           128: /* Define this if most significant bit is lowest numbered
        !           129:    in instructions that operate on numbered bit-fields.  */
        !           130: #define BITS_BIG_ENDIAN  0
        !           131: 
        !           132: /* Define this if most significant byte of a word is the lowest numbered.  */
        !           133: #define BYTES_BIG_ENDIAN 1
        !           134: 
        !           135: /* Define this if most significant word of a multiword number is the lowest
        !           136:    numbered.  */
        !           137: #define WORDS_BIG_ENDIAN 1
        !           138: 
        !           139: /* Number of bits in an addressable storage unit */
        !           140: #define BITS_PER_UNIT  8
        !           141: 
        !           142: /* Width in bits of a "word", which is the contents of a machine register.
        !           143:    Note that this is not necessarily the width of data type `int';
        !           144:    if using 16-bit ints on a 68000, this would still be 32.
        !           145:    But on a machine with 16-bit registers, this would be 16.  */
        !           146: #define BITS_PER_WORD  32
        !           147: #define MAX_BITS_PER_WORD 32
        !           148: 
        !           149: /* Width of a word, in units (bytes).  */
        !           150: #define UNITS_PER_WORD 4
        !           151: 
        !           152: /* Width in bits of a pointer.
        !           153:    See also the macro `Pmode' defined below.  */
        !           154: #define POINTER_SIZE  32
        !           155: 
        !           156: /* Allocation boundary (in *bits*) for storing arguments in argument list.  */
        !           157: #define PARM_BOUNDARY          32
        !           158: 
        !           159: /* Boundary (in *bits*) on which stack pointer should be aligned.  */
        !           160: #define STACK_BOUNDARY  32
        !           161: 
        !           162: /* Allocation boundary (in *bits*) for the code of a function.  */
        !           163: #define FUNCTION_BOUNDARY  16
        !           164: 
        !           165: /* Alignment of field after `int : 0' in a structure.  */
        !           166: #define EMPTY_FIELD_BOUNDARY  32
        !           167: 
        !           168: /* No data type wants to be aligned rounder than this.  */
        !           169: #define BIGGEST_ALIGNMENT  (TARGET_ALIGN_DOUBLE ? 64 : 32)
        !           170: 
        !           171: /* The best alignment to use in cases where we have a choice.  */
        !           172: #define FASTEST_ALIGNMENT 32
        !           173: 
        !           174: /* Every structures size must be a multiple of 32 bits.  */
        !           175: #define STRUCTURE_SIZE_BOUNDARY 32
        !           176: 
        !           177: /* Make strings word-aligned so strcpy from constants will be faster.  */
        !           178: #define CONSTANT_ALIGNMENT(EXP, ALIGN)  \
        !           179:   ((TREE_CODE (EXP) == STRING_CST      \
        !           180:     && (ALIGN) < FASTEST_ALIGNMENT)    \
        !           181:    ? FASTEST_ALIGNMENT : (ALIGN))
        !           182: 
        !           183: /* Make arrays of chars word-aligned for the same reasons.  */
        !           184: #define DATA_ALIGNMENT(TYPE, ALIGN)            \
        !           185:   (TREE_CODE (TYPE) == ARRAY_TYPE              \
        !           186:    && TYPE_MODE (TREE_TYPE (TYPE)) == QImode   \
        !           187:    && (ALIGN) < FASTEST_ALIGNMENT ? FASTEST_ALIGNMENT : (ALIGN))
        !           188: 
        !           189: /* Set this nonzero if move instructions will actually fail to work
        !           190:    when given unaligned data.  */
        !           191: #define STRICT_ALIGNMENT 1
        !           192: 
        !           193: 
        !           194: /* Standard register usage.  */
        !           195: 
        !           196: /* Register allocation for our first guess 
        !           197: 
        !           198:        r0-r3           scratch
        !           199:        r4-r7           args in and out
        !           200:        r8-r12          call saved
        !           201:        r13             assembler temp
        !           202:        r14             frame pointer
        !           203:        r15             stack pointer
        !           204:        ap              arg pointer (doesn't really exist, always eliminated)
        !           205:        pr              subroutine return address
        !           206:        t               t bit
        !           207:        mach            multiply/accumulate result
        !           208:        macl
        !           209: */
        !           210: 
        !           211: /* Number of actual hardware registers.
        !           212:    The hardware registers are assigned numbers for the compiler
        !           213:    from 0 to just below FIRST_PSEUDO_REGISTER.
        !           214:    All registers that the compiler knows about must be given numbers,
        !           215:    even those that are not normally considered general registers.
        !           216: 
        !           217:    SH has 16 integer registers and 4 control registers + the arg
        !           218:    pointer */
        !           219: 
        !           220: #define FIRST_PSEUDO_REGISTER 22
        !           221: 
        !           222: #define PR_REG   17
        !           223: #define T_REG    18
        !           224: #define GBR_REG  19
        !           225: #define MACH_REG 20
        !           226: #define MACL_REG 21
        !           227: 
        !           228: 
        !           229: /* 1 for registers that have pervasive standard uses
        !           230:    and are not available for the register allocator.  */
        !           231:  /*  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r10 r11 r12 r13 r14 r15 ap  pr  t   gbr mh   ml */
        !           232: #define FIXED_REGISTERS  \
        !           233:    { 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  1,  1,  0,  1,  1, 1,   1}
        !           234: 
        !           235: /* 1 for registers not available across function calls.
        !           236:    These must include the FIXED_REGISTERS and also any
        !           237:    registers that can be used without being saved.
        !           238:    The latter must include the registers where values are returned
        !           239:    and the register where structure-value addresses are passed.
        !           240:    Aside from that, you can include as many other registers as you like.  */
        !           241: 
        !           242:  /*  r0  r1  r2  r3  r4  r5  r6  r7  r8 r9  r10 r11 r12 r13 r14 r15 ap  pr  t   gbr mh  ml */
        !           243: #define CALL_USED_REGISTERS \
        !           244:    { 1,  1,  1,  1,  1,  1,  1,  1,  0, 0,  0,  0,  0,  1,  0,  1,  1,  0,  1,  1, 1, 1}
        !           245: 
        !           246: /* Return number of consecutive hard regs needed starting at reg REGNO
        !           247:    to hold something of mode MODE.
        !           248:    This is ordinarily the length in words of a value of mode MODE
        !           249:    but can be less for certain modes in special long registers.
        !           250: 
        !           251:    On the SH regs are UNITS_PER_WORD bits wide; */
        !           252: #define HARD_REGNO_NREGS(REGNO, MODE)  \
        !           253:    (((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD))
        !           254: 
        !           255: /* Value is 1 if hard register REGNO can hold a value of machine-mode MODE.
        !           256:    We may keep double values in even registers */
        !           257: 
        !           258: #define HARD_REGNO_MODE_OK(REGNO, MODE)  \
        !           259:   ((TARGET_ALIGN_DOUBLE && GET_MODE_SIZE(MODE) > 4) ? (((REGNO)&1)==0) : 1)
        !           260: 
        !           261: /* Value is 1 if it is a good idea to tie two pseudo registers
        !           262:    when one has mode MODE1 and one has mode MODE2.
        !           263:    If HARD_REGNO_MODE_OK could produce different values for MODE1 and MODE2,
        !           264:    for any hard reg, then this must be 0 for correct output.  */
        !           265: 
        !           266: #define MODES_TIEABLE_P(MODE1, MODE2) \
        !           267:   ((MODE1) == (MODE2) || GET_MODE_CLASS (MODE1) == GET_MODE_CLASS (MODE2))
        !           268: 
        !           269: /* Specify the registers used for certain standard purposes.
        !           270:    The values of these macros are register numbers.  */
        !           271: 
        !           272: /* Define this if the program counter is overloaded on a register.  */
        !           273: /* #define PC_REGNUM           15*/
        !           274: 
        !           275: /* Register to use for pushing function arguments.  */
        !           276: #define STACK_POINTER_REGNUM   15
        !           277: 
        !           278: /* Base register for access to local variables of the function.  */
        !           279: #define FRAME_POINTER_REGNUM   14
        !           280: 
        !           281: /* Value should be nonzero if functions must have frame pointers.
        !           282:    Zero means the frame pointer need not be set up (and parms may be accessed
        !           283:    via the stack pointer) in functions that seem suitable.  */
        !           284: 
        !           285: 
        !           286: #define FRAME_POINTER_REQUIRED (get_frame_size() > 1000)
        !           287: 
        !           288: /* Definitions for register eliminations.
        !           289: 
        !           290:    We have two registers that can be eliminated on the m88k.  First, the
        !           291:    frame pointer register can often be eliminated in favor of the stack
        !           292:    pointer register.  Secondly, the argument pointer register can always be
        !           293:    eliminated; it is replaced with either the stack or frame pointer.  */
        !           294: 
        !           295: /* This is an array of structures.  Each structure initializes one pair
        !           296:    of eliminable registers.  The "from" register number is given first,
        !           297:    followed by "to".  Eliminations of the same "from" register are listed
        !           298:    in order of preference.  */
        !           299: 
        !           300: #define ELIMINABLE_REGS                                \
        !           301: {{ FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM},        \
        !           302:  { ARG_POINTER_REGNUM,   STACK_POINTER_REGNUM},        \
        !           303:  { ARG_POINTER_REGNUM,   FRAME_POINTER_REGNUM},}
        !           304: 
        !           305: /* Given FROM and TO register numbers, say whether this elimination
        !           306:    is allowed.  */
        !           307: #define CAN_ELIMINATE(FROM, TO) \
        !           308:   (!((FROM) == FRAME_POINTER_REGNUM && FRAME_POINTER_REQUIRED))
        !           309: 
        !           310: /* Define the offset between two registers, one to be eliminated, and the other
        !           311:    its replacement, at the start of a routine.  */
        !           312: 
        !           313: #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
        !           314:   OFFSET = initial_elimination_offset (FROM, TO)
        !           315: 
        !           316: /* Base register for access to arguments of the function.  */
        !           317: #define ARG_POINTER_REGNUM     16
        !           318: 
        !           319: /* Register in which the static-chain is passed to a function.  */
        !           320: #define STATIC_CHAIN_REGNUM    13
        !           321: 
        !           322: /* The register in which a struct value address is passed */
        !           323: 
        !           324: #define STRUCT_VALUE_REGNUM 3
        !           325: 
        !           326: 
        !           327: 
        !           328: /* Define the classes of registers for register constraints in the
        !           329:    machine description.  Also define ranges of constants.
        !           330: 
        !           331:    One of the classes must always be named ALL_REGS and include all hard regs.
        !           332:    If there is more than one class, another class must be named NO_REGS
        !           333:    and contain no registers.
        !           334: 
        !           335:    The name GENERAL_REGS must be the name of a class (or an alias for
        !           336:    another name such as ALL_REGS).  This is the class of registers
        !           337:    that is allowed by "g" or "r" in a register constraint.
        !           338:    Also, registers outside this class are allocated only when
        !           339:    instructions express preferences for them.
        !           340: 
        !           341:    The classes must be numbered in nondecreasing order; that is,
        !           342:    a larger-numbered class must never be contained completely
        !           343:    in a smaller-numbered class.
        !           344: 
        !           345:    For any two classes, it is very desirable that there be another
        !           346:    class that represents their union.  */
        !           347: 
        !           348: /* The SH has two sorts of general registers, R0 and the rest.  R0 can 
        !           349:    be used as the destination of some of the arithmetic ops. There are
        !           350:    also some special purpose registers; the T bit register, the
        !           351:    Procedure Return Register and the Multipy Accumulate Registers */
        !           352: 
        !           353: enum reg_class
        !           354: {
        !           355:   NO_REGS,
        !           356:   R0_REGS,
        !           357:   GENERAL_REGS,
        !           358:   PR_REGS,
        !           359:   T_REGS,
        !           360:   MAC_REGS,
        !           361:   ALL_REGS,
        !           362:   LIM_REG_CLASSES
        !           363: };
        !           364: 
        !           365: #define N_REG_CLASSES  (int) LIM_REG_CLASSES
        !           366: 
        !           367: /* Give names of register classes as strings for dump file.   */
        !           368: #define REG_CLASS_NAMES  \
        !           369: {                      \
        !           370:   "NO_REGS",           \
        !           371:   "R0_REGS",           \
        !           372:   "GENERAL_REGS",      \
        !           373:   "PR_REGS",           \
        !           374:   "T_REGS",            \
        !           375:   "MAC_REGS",          \
        !           376:   "ALL_REGS",          \
        !           377: }
        !           378: 
        !           379: /* Define which registers fit in which classes.
        !           380:    This is an initializer for a vector of HARD_REG_SET
        !           381:    of length N_REG_CLASSES.  */
        !           382: 
        !           383: #define REG_CLASS_CONTENTS      \
        !           384: {                              \
        !           385:   0x000000,  /* NO_REGS      */        \
        !           386:   0x000001,  /* R0_REGS      */        \
        !           387:   0x01FFFF,  /* GENERAL_REGS */        \
        !           388:   0x020000,  /* PR_REGS      */        \
        !           389:   0x040000,  /* T_REGS       */        \
        !           390:   0x300000,  /* MAC_REGS     */        \
        !           391:   0x37FFFF   /* ALL_REGS     */        \
        !           392: }
        !           393: 
        !           394: /* The same information, inverted:
        !           395:    Return the class number of the smallest class containing
        !           396:    reg number REGNO.  This could be a conditional expression
        !           397:    or could index an array.  */
        !           398: 
        !           399: extern int regno_reg_class[];
        !           400: #define REGNO_REG_CLASS(REGNO) regno_reg_class[REGNO]
        !           401: 
        !           402: /* The order in which register should be allocated.  */
        !           403: #define REG_ALLOC_ORDER  \
        !           404:   { 1,2,3,7,4,5,6,0,8,9,10,11,12,13,14,15,16,17,18,19,20,21}
        !           405: 
        !           406: /* The class value for index registers, and the one for base regs.  */
        !           407: #define INDEX_REG_CLASS  R0_REGS
        !           408: #define BASE_REG_CLASS  GENERAL_REGS
        !           409: 
        !           410: /* Get reg_class from a letter such as appears in the machine 
        !           411:    description. */
        !           412: extern enum reg_class reg_class_from_letter[];
        !           413: 
        !           414: #define REG_CLASS_FROM_LETTER(C) \
        !           415:    ( (C) >= 'a' && (C) <= 'z' ? reg_class_from_letter[(C)-'a'] : NO_REGS )
        !           416: 
        !           417: 
        !           418: /* The letters I, J, K, L and M in a register constraint string
        !           419:    can be used to stand for particular ranges of immediate operands.
        !           420:    This macro defines what the ranges are.
        !           421:    C is the letter, and VALUE is a constant value.
        !           422:    Return 1 if VALUE is in the range specified by C.
        !           423:        I: arithmetic operand -127..128, as used in add, sub, etc
        !           424:        L: logical operand 0..255, as used in and, or, etc.
        !           425:        M: constant 1
        !           426:        K: shift operand 1,2,8 or 16 */
        !           427: 
        !           428: 
        !           429: #define CONST_OK_FOR_I(VALUE) (((int)(VALUE))>= -128 && ((int)(VALUE)) <= 127)
        !           430: #define CONST_OK_FOR_L(VALUE) (((int)(VALUE))>=    0 && ((int)(VALUE)) <= 255)
        !           431: #define CONST_OK_FOR_M(VALUE) ((VALUE)==1)
        !           432: #define CONST_OK_FOR_K(VALUE) ((VALUE)==1||(VALUE)==2||(VALUE)==8||(VALUE)==16)
        !           433: 
        !           434: #define CONST_OK_FOR_LETTER_P(VALUE, C)     \
        !           435:      ((C) == 'I' ? CONST_OK_FOR_I (VALUE)   \
        !           436:     : (C) == 'L' ? CONST_OK_FOR_L (VALUE)   \
        !           437:     : (C) == 'M' ? CONST_OK_FOR_M (VALUE)   \
        !           438:     : (C) == 'K' ? CONST_OK_FOR_K (VALUE)   \
        !           439:     : 0)
        !           440: 
        !           441: /* Similar, but for floating constants, and defining letters G and H.
        !           442:    Here VALUE is the CONST_DOUBLE rtx itself.  */
        !           443: 
        !           444: #define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \
        !           445:    ((C) == 'G' ? CONST_OK_FOR_I (CONST_DOUBLE_HIGH (VALUE)) \
        !           446:              && CONST_OK_FOR_I (CONST_DOUBLE_LOW (VALUE))  \
        !           447:     : 0)
        !           448: 
        !           449: /* Given an rtx X being reloaded into a reg required to be
        !           450:    in class CLASS, return the class of reg to actually use.
        !           451:    In general this is just CLASS; but on some machines
        !           452:    in some cases it is preferable to use a more restrictive class.  */
        !           453: 
        !           454: #define PREFERRED_RELOAD_CLASS(X, CLASS)  CLASS
        !           455: 
        !           456: /* Return the register class of a scratch register needed to copy IN into
        !           457:    or out of a register in CLASS in MODE.  If it can be done directly,
        !           458:    NO_REGS is returned.  */
        !           459: 
        !           460: #define SECONDARY_RELOAD_CLASS(CLASS, MODE, X) NO_REGS
        !           461: 
        !           462: /* Return the maximum number of consecutive registers
        !           463:    needed to represent mode MODE in a register of class CLASS. 
        !           464: 
        !           465:    On SH this is the size of MODE in words */
        !           466: #define CLASS_MAX_NREGS(CLASS, MODE)  \
        !           467:      ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
        !           468: 
        !           469: 
        !           470: /* Stack layout; function entry, exit and calling.  */
        !           471: 
        !           472: /* Define the number of register that can hold parameters.
        !           473:    These two macros are used only in other macro definitions below.  */
        !           474: #define NPARM_REGS 4
        !           475: #define FIRST_PARM_REG 4
        !           476: #define FIRST_RET_REG 4
        !           477: 
        !           478: /* Define this if pushing a word on the stack
        !           479:    makes the stack pointer a smaller address.  */
        !           480: #define STACK_GROWS_DOWNWARD  
        !           481: 
        !           482: /* Define this if the nominal address of the stack frame
        !           483:    is at the high-address end of the local variables;
        !           484:    that is, each additional local variable allocated
        !           485:    goes at a more negative offset in the frame.  */
        !           486: #define FRAME_GROWS_DOWNWARD 
        !           487: 
        !           488: /* Offset within stack frame to start allocating local variables at.
        !           489:    If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
        !           490:    first local allocated.  Otherwise, it is the offset to the BEGINNING
        !           491:    of the first local allocated.  */
        !           492: #define STARTING_FRAME_OFFSET  0
        !           493: 
        !           494: /* If we generate an insn to push BYTES bytes,
        !           495:    this says how many the stack pointer really advances by.  */
        !           496: #define PUSH_ROUNDING(NPUSHED)  (((NPUSHED) + 3) & ~3)
        !           497: 
        !           498: /* Offset of first parameter from the argument pointer register value.  */
        !           499: #define FIRST_PARM_OFFSET(FNDECL)  0
        !           500: 
        !           501: /* Value is the number of byte of arguments automatically
        !           502:    popped when returning from a subroutine call.
        !           503:    FUNTYPE is the data type of the function (as a tree),
        !           504:    or for a library call it is an identifier node for the subroutine name.
        !           505:    SIZE is the number of bytes of arguments passed on the stack.
        !           506: 
        !           507:    On the SH, the caller does not pop any of its arguments that were passed
        !           508:    on the stack.  */
        !           509: #define RETURN_POPS_ARGS(FUNTYPE, SIZE)  0
        !           510: 
        !           511: /* Define how to find the value returned by a function.
        !           512:    VALTYPE is the data type of the value (as a tree).
        !           513:    If the precise function being called is known, FUNC is its FUNCTION_DECL;
        !           514:    otherwise, FUNC is 0.  */
        !           515: #define FUNCTION_VALUE(VALTYPE, FUNC)  \
        !           516:     gen_rtx (REG, TYPE_MODE (VALTYPE), FIRST_RET_REG)
        !           517: 
        !           518: /* Define how to find the value returned by a library function
        !           519:    assuming the value has mode MODE.  */
        !           520: #define LIBCALL_VALUE(MODE)  \
        !           521:     gen_rtx (REG, MODE, FIRST_RET_REG)
        !           522: 
        !           523: /* 1 if N is a possible register number for a function value.
        !           524:    On the SH, only r4 can return results.  */
        !           525: #define FUNCTION_VALUE_REGNO_P(REGNO)  \
        !           526:          ((REGNO) == FIRST_RET_REG)
        !           527: 
        !           528: /* 1 if N is a possible register number for function argument passing.*/
        !           529: 
        !           530: #define FUNCTION_ARG_REGNO_P(REGNO)  \
        !           531:   ((REGNO) >= FIRST_PARM_REG && (REGNO) < (NPARM_REGS + FIRST_PARM_REG))
        !           532: 
        !           533: 
        !           534: 
        !           535: /* Define a data type for recording info about an argument list
        !           536:    during the scan of that argument list.  This data type should
        !           537:    hold all necessary information about the function itself
        !           538:    and about the args processed so far, enough to enable macros
        !           539:    such as FUNCTION_ARG to determine where the next arg should go.
        !           540: 
        !           541:    On SH, this is a single integer, which is a number of words
        !           542:    of arguments scanned so far (including the invisible argument,
        !           543:    if any, which holds the structure-value-address).
        !           544:    Thus NARGREGS or more means all following args should go on the stack.  */
        !           545: 
        !           546: #define CUMULATIVE_ARGS  int
        !           547: 
        !           548: #define ROUND_ADVANCE(SIZE)    \
        !           549:   ((SIZE + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
        !           550: 
        !           551: /* Round a register number up to a proper boundary for an arg of mode 
        !           552:    MODE. 
        !           553:    
        !           554:    We round to an even reg for things larger than a word */
        !           555: 
        !           556: #define ROUND_REG(X, MODE)                                     \
        !           557:   ((TARGET_ALIGN_DOUBLE                                        \
        !           558:    && GET_MODE_UNIT_SIZE ((MODE)) > UNITS_PER_WORD)            \
        !           559:    ? ((X) + ((X) & 1)) : (X))
        !           560: 
        !           561: 
        !           562: /* Initialize a variable CUM of type CUMULATIVE_ARGS
        !           563:    for a call to a function whose data type is FNTYPE.
        !           564:    For a library call, FNTYPE is 0.
        !           565: 
        !           566:    On SH, the offset always starts at 0: the first parm reg is always
        !           567:    the same reg.  */
        !           568: 
        !           569: #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME)  \
        !           570:   ((CUM) = 0)
        !           571: 
        !           572: /* Update the data in CUM to advance over an argument
        !           573:    of mode MODE and data type TYPE.
        !           574:    (TYPE is null for libcalls where that information may not be
        !           575:    available.)  */
        !           576: 
        !           577: #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED)   \
        !           578:  ((CUM) = (ROUND_REG ((CUM), (MODE))                   \
        !           579:           + ((MODE) != BLKmode                         \
        !           580:              ? ROUND_ADVANCE (GET_MODE_SIZE (MODE))    \
        !           581:              : ROUND_ADVANCE (int_size_in_bytes (TYPE)))))
        !           582: 
        !           583: /* Define where to put the arguments to a function.
        !           584:    Value is zero to push the argument on the stack,
        !           585:    or a hard register in which to store the argument.
        !           586: 
        !           587:    MODE is the argument's machine mode.
        !           588:    TYPE is the data type of the argument (as a tree).
        !           589:     This is null for libcalls where that information may
        !           590:     not be available.
        !           591:    CUM is a variable of type CUMULATIVE_ARGS which gives info about
        !           592:     the preceding args and about the function being called.
        !           593:    NAMED is nonzero if this argument is a named parameter
        !           594:     (otherwise it is an extra parameter matching an ellipsis).
        !           595: 
        !           596:    On SH the first args are normally in registers
        !           597:    and the rest are pushed.  Any arg that starts within the first
        !           598:    NPARM_REGS words is at least partially passed in a register unless
        !           599:    its data type forbids.  */
        !           600: 
        !           601: #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED)                   \
        !           602:   (NAMED && ROUND_REG ((CUM), (MODE)) < NPARM_REGS             \
        !           603:    && ((TYPE)==0 || ! TREE_ADDRESSABLE ((tree)(TYPE)))         \
        !           604:    && ((TYPE)==0 || (MODE) != BLKmode                          \
        !           605:        || (TYPE_ALIGN ((TYPE)) % PARM_BOUNDARY == 0))          \
        !           606:    ? gen_rtx (REG, (MODE),                                     \
        !           607:            (FIRST_PARM_REG + ROUND_REG ((CUM), (MODE))))       \
        !           608:    : 0)
        !           609: 
        !           610: /* For an arg passed partly in registers and partly in memory,
        !           611:    this is the number of registers used.
        !           612:    For args passed entirely in registers or entirely in memory, zero.
        !           613:    Any arg that starts in the first NPARM_REGS regs but won't entirely
        !           614:    fit in them needs partial registers on the SH.  */
        !           615: 
        !           616: #define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED)             \
        !           617:   ((ROUND_REG ((CUM), (MODE)) < NPARM_REGS                             \
        !           618:     && ((TYPE)==0 || ! TREE_ADDRESSABLE ((tree)(TYPE)))                        \
        !           619:     && ((TYPE)==0 || (MODE) != BLKmode                                 \
        !           620:        || (TYPE_ALIGN ((TYPE)) % PARM_BOUNDARY == 0))                  \
        !           621:     && (ROUND_REG ((CUM), (MODE))                                      \
        !           622:        + ((MODE) == BLKmode                                            \
        !           623:           ? ROUND_ADVANCE (int_size_in_bytes (TYPE))                   \
        !           624:           : ROUND_ADVANCE (GET_MODE_SIZE (MODE)))) - NPARM_REGS > 0)   \
        !           625:    ? (NPARM_REGS - ROUND_REG ((CUM), (MODE)))                          \
        !           626:    : 0)
        !           627: 
        !           628: extern int current_function_anonymous_args;
        !           629: 
        !           630: /* Perform any needed actions needed for a function that is receiving a
        !           631:    variable number of arguments. */
        !           632: 
        !           633: #define SETUP_INCOMING_VARARGS(ASF, MODE, TYPE, PAS, ST) \
        !           634:   current_function_anonymous_args = 1;
        !           635: 
        !           636: 
        !           637: /* Call the function profiler with a given profile label. */
        !           638: 
        !           639: #define FUNCTION_PROFILER(STREAM,LABELNO)                      \
        !           640: {                                                              \
        !           641:        fprintf(STREAM, "       trapa   #5\n");                 \
        !           642:        fprintf(STREAM, "       .align  2\n");                  \
        !           643:        fprintf(STREAM, "       .long   LP%d\n", (LABELNO));    \
        !           644: }
        !           645: 
        !           646: 
        !           647: /* EXIT_IGNORE_STACK should be nonzero if, when returning from a function,
        !           648:    the stack pointer does not matter.  The value is tested only in
        !           649:    functions that have frame pointers.
        !           650:    No definition is equivalent to always zero.  */
        !           651: 
        !           652: #define EXIT_IGNORE_STACK 0
        !           653: 
        !           654: /* Generate the assembly code for function exit 
        !           655:    Just dump out any accumulated constant table.*/
        !           656: 
        !           657: #define FUNCTION_EPILOGUE(STREAM, SIZE)  \
        !           658:   dump_constants(0);  
        !           659: 
        !           660: /* Output assembler code for a block containing the constant parts
        !           661:    of a trampoline, leaving space for the variable parts.
        !           662: 
        !           663:    On the SH, the trapoline looks like
        !           664:    1 0000 D301                 mov.l   l1,r3
        !           665:    2 0002 DD02                 mov.l   l2,r13
        !           666:    3 0004 4D2B                 jmp     @r13
        !           667:    4 0006 200B                 or      r0,r0
        !           668:    5 0008 00000000     l1:     .long   function
        !           669:    6 000c 00000000     l2:     .long   area    
        !           670: */
        !           671: #define TRAMPOLINE_TEMPLATE(FILE)              \
        !           672: {                                              \
        !           673:   fprintf ((FILE), "   .word   0xd301\n");     \
        !           674:   fprintf ((FILE), "   .word   0xdd02\n");     \
        !           675:   fprintf ((FILE), "   .word   0x4d2b\n");        \
        !           676:   fprintf ((FILE), "   .word   0x200b\n");     \
        !           677:   fprintf ((FILE), "   .long   0\n");          \
        !           678:   fprintf ((FILE), "   .long   0\n");          \
        !           679: }
        !           680: 
        !           681: /* Length in units of the trampoline for entering a nested function.  */
        !           682: #define TRAMPOLINE_SIZE  16
        !           683: 
        !           684: /* Alignment required for a trampoline in units.  */
        !           685: #define TRAMPOLINE_ALIGN  4
        !           686: 
        !           687: /* Emit RTL insns to initialize the variable parts of a trampoline.
        !           688:    FNADDR is an RTX for the address of the function's pure code.
        !           689:    CXT is an RTX for the static chain value for the function.  */
        !           690: 
        !           691: #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT)  \
        !           692: {                                                                      \
        !           693:   emit_move_insn (gen_rtx (MEM, SImode, plus_constant ((TRAMP), 8)),   \
        !           694:                  (CXT));                                               \
        !           695:   emit_move_insn (gen_rtx (MEM, SImode, plus_constant ((TRAMP), 12)),  \
        !           696:                  (FNADDR));                                            \
        !           697: }
        !           698: 
        !           699: 
        !           700: /* Addressing modes, and classification of registers for them.  */
        !           701: 
        !           702: /*#define HAVE_POST_INCREMENT  1*/
        !           703: /*#define HAVE_PRE_INCREMENT   1*/
        !           704: /*#define HAVE_POST_DECREMENT  1*/
        !           705: /*#define HAVE_PRE_DECREMENT   1*/
        !           706: 
        !           707: /* Macros to check register numbers against specific register classes.  */
        !           708: 
        !           709: /* These assume that REGNO is a hard or pseudo reg number.
        !           710:    They give nonzero only if REGNO is a hard reg of the suitable class
        !           711:    or a pseudo reg currently allocated to a suitable hard reg.
        !           712:    Since they use reg_renumber, they are safe only once reg_renumber
        !           713:    has been allocated, which happens in local-alloc.c.
        !           714: 
        !           715: */
        !           716: #define REGNO_OK_FOR_BASE_P(REGNO)  \
        !           717:   ((REGNO) < PR_REG || (unsigned) reg_renumber[(REGNO)] < PR_REG)
        !           718: 
        !           719: #define REGNO_OK_FOR_INDEX_P(REGNO)   ((REGNO)==0)
        !           720: 
        !           721: /* Maximum number of registers that can appear in a valid memory 
        !           722:    address. */
        !           723: 
        !           724: #define MAX_REGS_PER_ADDRESS 4
        !           725: 
        !           726: /* Recognize any constant value that is a valid address.  */
        !           727: 
        !           728: #define CONSTANT_ADDRESS_P(X)  \
        !           729:   (GET_CODE (X) == LABEL_REF)
        !           730: 
        !           731: /* Nonzero if the constant value X is a legitimate general operand.
        !           732:    It is given that X satisfies CONSTANT_P or is a CONST_DOUBLE.
        !           733: 
        !           734:    On the SH, allow anything but a double */
        !           735: 
        !           736: #define LEGITIMATE_CONSTANT_P(X)  (GET_CODE(X) != CONST_DOUBLE)
        !           737: 
        !           738: /* The macros REG_OK_FOR..._P assume that the arg is a REG rtx
        !           739:    and check its validity for a certain class.
        !           740:    We have two alternate definitions for each of them.
        !           741:    The usual definition accepts all pseudo regs; the other rejects
        !           742:    them unless they have been allocated suitable hard regs.
        !           743:    The symbol REG_OK_STRICT causes the latter definition to be used.  */
        !           744: 
        !           745: #ifndef REG_OK_STRICT
        !           746: 
        !           747: /* Nonzero if X is a hard reg that can be used as a base reg
        !           748:    or if it is a pseudo reg.  */
        !           749: #define REG_OK_FOR_BASE_P(X) \
        !           750:        (REGNO (X) <= 16 || REGNO (X) >= FIRST_PSEUDO_REGISTER)
        !           751: 
        !           752: /* Nonzero if X is a hard reg that can be used as an index
        !           753:    or if it is a pseudo reg.  */
        !           754: #define REG_OK_FOR_INDEX_P(X) \
        !           755:        (REGNO (X) == 0 || REGNO (X) >= FIRST_PSEUDO_REGISTER)
        !           756: 
        !           757: #define REG_OK_FOR_PRE_POST_P(X) \
        !           758:        (REGNO (X) <= 16)
        !           759: 
        !           760: #else
        !           761: 
        !           762: /* Nonzero if X is a hard reg that can be used as a base reg.  */
        !           763: #define REG_OK_FOR_BASE_P(X)   \
        !           764:        REGNO_OK_FOR_BASE_P (REGNO (X))
        !           765: 
        !           766: /* Nonzero if X is a hard reg that can be used as an index.  */
        !           767: #define REG_OK_FOR_INDEX_P(X)  \
        !           768:        REGNO_OK_FOR_INDEX_P (REGNO (X))
        !           769: 
        !           770: #define REG_OK_FOR_PRE_POST_P(X)  \
        !           771:        (REGNO (X) <= 16 || (unsigned) reg_renumber[REGNO (X)] <=16)
        !           772: #endif
        !           773: 
        !           774: /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
        !           775:    that is a valid memory address for an instruction.
        !           776:    The MODE argument is the machine mode for the MEM expression
        !           777:    that wants to use this address.
        !           778: 
        !           779:    The other macros defined here are used only in GO_IF_LEGITIMATE_ADDRESS.  */
        !           780: 
        !           781: #define BASE_REGISTER_RTX_P(X)  \
        !           782:   (GET_CODE (X) == REG && REG_OK_FOR_BASE_P (X))
        !           783: 
        !           784: #define INDEX_REGISTER_RTX_P(X)  \
        !           785:   (GET_CODE (X) == REG && REG_OK_FOR_INDEX_P (X))
        !           786: 
        !           787: 
        !           788: /* Jump to LABEL if X is a valid address RTX.  This must also take
        !           789:    REG_OK_STRICT into account when deciding about valid registers, but it uses
        !           790:    the above macros so we are in luck.  
        !           791:  
        !           792:    Allow  REG
        !           793:          REG+disp
        !           794:          REG+r0
        !           795:          REG++
        !           796:          --REG
        !           797: */
        !           798: 
        !           799: /* The SH allows a displacement in a QI or HI amode, but only when the 
        !           800:    other operand is R0. GCC doesn't handle this very well, so we forgo
        !           801:    all of that.
        !           802: 
        !           803:    A legitimate index for a QI or HI is 0, SI and above can be any 
        !           804:    number 0..63 */
        !           805: 
        !           806: #define GO_IF_LEGITIMATE_INDEX(MODE, REGNO, OP, LABEL)  \
        !           807:   do {                                                 \
        !           808:     if (GET_CODE (OP) == CONST_INT)                    \
        !           809:       {                                                        \
        !           810:        if (0&&GET_MODE_SIZE (MODE) == 2 && ((unsigned)INTVAL(OP)) <=30)\
        !           811:          goto LABEL;                                   \
        !           812:        if (0&&GET_MODE_SIZE (MODE) == 1 && ((unsigned)INTVAL(OP)) <=15)\
        !           813:          goto LABEL;                                   \
        !           814:        if (GET_MODE_SIZE (MODE) >=4                    \
        !           815:            && ((unsigned)INTVAL(OP)) < 64)             \
        !           816:          goto LABEL;                                   \
        !           817:       }                                                        \
        !           818:   } while(0)
        !           819: 
        !           820: 
        !           821: #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, LABEL)                  \
        !           822: {                                                                \
        !           823:   if (BASE_REGISTER_RTX_P (X))                                   \
        !           824:     goto LABEL;                                                          \
        !           825:   else if ((GET_CODE (X) == POST_INC || GET_CODE (X) == PRE_DEC)  \
        !           826:           && GET_CODE (XEXP (X, 0)) == REG                       \
        !           827:           && REG_OK_FOR_PRE_POST_P (XEXP (X, 0)))                \
        !           828:     goto LABEL;                                                          \
        !           829:   else if (GET_CODE (X) == PLUS || GET_CODE(X) == LO_SUM)        \
        !           830:     {                                                            \
        !           831:       rtx xop0 = XEXP(X,0);                                      \
        !           832:       rtx xop1 = XEXP(X,1);                                      \
        !           833:       if (GET_MODE_SIZE(MODE) >= 4 && BASE_REGISTER_RTX_P (xop0)) \
        !           834:        GO_IF_LEGITIMATE_INDEX (MODE, REGNO (xop0), xop1, LABEL); \
        !           835:       if (GET_MODE_SIZE(MODE) >= 4 && BASE_REGISTER_RTX_P (xop1)) \
        !           836:        GO_IF_LEGITIMATE_INDEX (MODE, REGNO (xop1), xop0, LABEL); \
        !           837:       if (GET_MODE_SIZE(MODE)<=4) {                              \
        !           838:        if(BASE_REGISTER_RTX_P(xop1) &&                           \
        !           839:           INDEX_REGISTER_RTX_P(xop0)) goto LABEL;                \
        !           840:        if(INDEX_REGISTER_RTX_P(xop1) &&                          \
        !           841:           BASE_REGISTER_RTX_P(xop0)) goto LABEL;                 \
        !           842:       }                                                                  \
        !           843:     }                                                            \
        !           844:   else if ((GET_CODE (X) == PRE_INC || GET_CODE (X) == POST_DEC)  \
        !           845:           && GET_CODE (XEXP (X, 0)) == REG                       \
        !           846:           && REG_OK_FOR_PRE_POST_P (XEXP (X, 0)))                \
        !           847:     goto LABEL;                                                   \
        !           848: }                                                                 
        !           849:                                                                   
        !           850:                                                                  
        !           851: /* Try machine-dependent ways of modifying an illegitimate address 
        !           852:    to be legitimate.  If we find one, return the new, valid address.
        !           853:    This macro is used in only one place: `memory_address' in explow.c.
        !           854: 
        !           855:    OLDX is the address as it was before break_out_memory_refs was called.
        !           856:    In some cases it is useful to look at this to decide what needs to be done.
        !           857: 
        !           858:    MODE and WIN are passed so that this macro can use
        !           859:    GO_IF_LEGITIMATE_ADDRESS.
        !           860: 
        !           861:    It is always safe for this macro to do nothing.  It exists to recognize
        !           862:    opportunities to optimize the output.
        !           863: 
        !           864:    On the SH we don't try anything */
        !           865: 
        !           866: #define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN)  ;
        !           867: 
        !           868: /* Go to LABEL if ADDR (a legitimate address expression)
        !           869:    has an effect that depends on the machine mode it is used for.  */
        !           870: #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)  \
        !           871: {                                                                      \
        !           872:   if (GET_CODE(ADDR) == PRE_DEC || GET_CODE(ADDR) == POST_DEC          \
        !           873:       || GET_CODE(ADDR) == PRE_INC || GET_CODE(ADDR) == POST_INC)      \
        !           874:     goto LABEL;                                                                \
        !           875: }
        !           876: 
        !           877: /* Specify the machine mode that this machine uses
        !           878:    for the index in the tablejump instruction.  */
        !           879: #define CASE_VECTOR_MODE SImode
        !           880: 
        !           881: /* Define this if the tablejump instruction expects the table
        !           882:    to contain offsets from the address of the table.
        !           883:    Do not define this if the table should contain absolute addresses.  */
        !           884: /* #define CASE_VECTOR_PC_RELATIVE */
        !           885: 
        !           886: /* Specify the tree operation to be used to convert reals to integers.  */
        !           887: #define IMPLICIT_FIX_EXPR  FIX_ROUND_EXPR
        !           888: 
        !           889: /* This is the kind of divide that is easiest to do in the general case.  */
        !           890: #define EASY_DIV_EXPR  TRUNC_DIV_EXPR
        !           891: 
        !           892: /* 'char' is signed by default */
        !           893: #define DEFAULT_SIGNED_CHAR  1
        !           894: 
        !           895: /* The type of size_t unsigned int.  */
        !           896: #define SIZE_TYPE "unsigned int"
        !           897: 
        !           898: /* Don't cse the address of the function being compiled.  */
        !           899: #define NO_RECURSIVE_FUNCTION_CSE 1
        !           900: 
        !           901: /* Max number of bytes we can move from memory to memory
        !           902:    in one reasonably fast instruction.  */
        !           903: #define MOVE_MAX 4
        !           904: 
        !           905: /* Define if operations between registers always perform the operation
        !           906:    on the full register even if a narrower mode is specified.  */
        !           907: #define WORD_REGISTER_OPERATIONS
        !           908: 
        !           909: /* Define if loading in MODE, an integral mode narrower than BITS_PER_WORD
        !           910:    will either zero-extend or sign-extend.  The value of this macro should
        !           911:    be the code that says which one of the two operations is implicitly
        !           912:    done, NIL if none.  */
        !           913: #define LOAD_EXTEND_OP(MODE) SIGN_EXTEND
        !           914: 
        !           915: /* Define this if zero-extension is slow (more than one real instruction).
        !           916:    On the SH, it's only one instruction */
        !           917: /* #define SLOW_ZERO_EXTEND */
        !           918: 
        !           919: /* Nonzero if access to memory by bytes is slow and undesirable.  */
        !           920: #define SLOW_BYTE_ACCESS 0
        !           921: 
        !           922: /* We assume that the store-condition-codes instructions store 0 for false
        !           923:    and some other value for true.  This is the value stored for true.  */
        !           924: 
        !           925: #define STORE_FLAG_VALUE 1
        !           926: 
        !           927: /* Immediate shift counts are truncated by the output routines (or was it
        !           928:    the assembler?).  Shift counts in a register are truncated by ARM.  Note
        !           929:    that the native compiler puts too large (> 32) immediate shift counts
        !           930:    into a register and shifts by the register, letting the ARM decide what
        !           931:    to do instead of doing that itself.  */
        !           932: #define SHIFT_COUNT_TRUNCATED 1
        !           933: 
        !           934: /* All integers have the same format so truncation is easy.  */
        !           935: #define TRULY_NOOP_TRUNCATION(OUTPREC,INPREC)  1
        !           936: 
        !           937: /* Define this if addresses of constant functions
        !           938:    shouldn't be put through pseudo regs where they can be cse'd.
        !           939:    Desirable on machines where ordinary constants are expensive
        !           940:    but a CALL with constant address is cheap.  */
        !           941: /*#define NO_FUNCTION_CSE 1*/
        !           942: 
        !           943: /* Chars and shorts should be passed as ints.  */
        !           944: #define PROMOTE_PROTOTYPES 1
        !           945: 
        !           946: /* The machine modes of pointers and functions */
        !           947: #define Pmode  SImode
        !           948: #define FUNCTION_MODE  Pmode
        !           949: 
        !           950: /* The structure type of the machine dependent info field of insns
        !           951:    No uses for this yet.  */
        !           952: /* #define INSN_MACHINE_INFO  struct machine_info  */
        !           953: 
        !           954: /* The relative costs of various types of constants.  Note that cse.c defines
        !           955:    REG = 1, SUBREG = 2, any node = (2 + sum of subnodes).  */
        !           956: 
        !           957: #define CONST_COSTS(RTX, CODE, OUTER_CODE)      \
        !           958:   case CONST_INT:                              \
        !           959:     if (CONST_OK_FOR_I (INTVAL(RTX)))           \
        !           960:       return 1;                                        \
        !           961:     else                                       \
        !           962:       return 8;                                        \
        !           963:   case CONST:                                  \
        !           964:   case LABEL_REF:                              \
        !           965:   case SYMBOL_REF:                             \
        !           966:     return 5;                                  \
        !           967:   case CONST_DOUBLE:                           \
        !           968:       return 10;
        !           969: 
        !           970: #define RTX_COSTS(X, CODE, OUTER_CODE)                 \
        !           971:   case MULT:                                           \
        !           972:     return COSTS_N_INSNS (multcosts (X));              \
        !           973:   case ASHIFT:                                         \
        !           974:   case ASHIFTRT:                                       \
        !           975:   case LSHIFT:                                         \
        !           976:     return COSTS_N_INSNS (shiftcosts (X)) ;            \
        !           977:   case DIV:                                            \
        !           978:   case UDIV:                                           \
        !           979:   case MOD:                                            \
        !           980:   case UMOD:                                           \
        !           981:     return COSTS_N_INSNS (100);                                \
        !           982:   case FLOAT:                                          \
        !           983:   case FIX:                                            \
        !           984:     return 100;
        !           985: 
        !           986: /* Compute extra cost of moving data between one register class
        !           987:    and another.  
        !           988: 
        !           989:    On the SH it is hard to move into the T reg, but simple to load
        !           990:    from it.
        !           991: */
        !           992: 
        !           993: #define REGISTER_MOVE_COST(SRCCLASS, DSTCLASS)  \
        !           994:        ((DSTCLASS == T_REGS) ? 10 : 1)
        !           995: 
        !           996: /* Assembler output control */
        !           997: 
        !           998: /* The text to go at the start of the assembler file */
        !           999: #define ASM_FILE_START(STREAM)                                                         \
        !          1000:   output_file_start (STREAM, f_options, sizeof f_options / sizeof f_options[0], \
        !          1001:                     W_options, sizeof W_options / sizeof W_options[0]);        
        !          1002: 
        !          1003: 
        !          1004: #define ASM_FILE_END(STREAM) \
        !          1005:   dump_constants(0);  
        !          1006: 
        !          1007: #define ASM_APP_ON  ""
        !          1008: #define ASM_APP_OFF  ""
        !          1009: 
        !          1010: #define FILE_ASM_OP "\t.file\n"
        !          1011: #define IDENT_ASM_OP "\t.ident\n"
        !          1012: 
        !          1013: 
        !          1014: /* Switch to the text or data segment.  */
        !          1015: #define TEXT_SECTION_ASM_OP  "\t.text"
        !          1016: #define DATA_SECTION_ASM_OP  "\t.data"
        !          1017: #define CTORS_SECTION_ASM_OP "\t.section\t.ctors\n"
        !          1018: #define DTORS_SECTION_ASM_OP "\t.section\t.dtors\n"
        !          1019: 
        !          1020: #define EXTRA_SECTIONS in_ctors, in_dtors
        !          1021: #define EXTRA_SECTION_FUNCTIONS                              \
        !          1022: void                                                        \
        !          1023: ctors_section()                                             \
        !          1024: {                                                           \
        !          1025:   if (in_section != in_ctors)                               \
        !          1026:     {                                                       \
        !          1027:       fprintf (asm_out_file, "%s\n", CTORS_SECTION_ASM_OP);  \
        !          1028:       in_section = in_ctors;                                \
        !          1029:     }                                                       \
        !          1030: }                                                           \
        !          1031: void                                                        \
        !          1032: dtors_section()                                             \
        !          1033: {                                                           \
        !          1034:   if (in_section != in_dtors)                               \
        !          1035:     {                                                       \
        !          1036:       fprintf (asm_out_file, "%s\n", DTORS_SECTION_ASM_OP);  \
        !          1037:       in_section = in_dtors;                                \
        !          1038:     }                                                       \
        !          1039: }                                                            
        !          1040: 
        !          1041: #define ASM_OUTPUT_SECTION(file, nam) \
        !          1042:    do { fprintf (file, "\t.section\t%s\n", nam); } while(0) 
        !          1043: 
        !          1044: #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME)      \
        !          1045:    do { ctors_section();  fprintf(FILE,"\t.long\t_%s\n", NAME); } while (0)
        !          1046: 
        !          1047: #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME)       \
        !          1048:    do {  dtors_section();  fprintf(FILE,"\t.long\t_%s\n", NAME); } while (0)
        !          1049: 
        !          1050: 
        !          1051: #undef DO_GLOBAL_CTORS_BODY                     
        !          1052: #define DO_GLOBAL_CTORS_BODY                   \
        !          1053: {                                              \
        !          1054:   typedef (*pfunc)();                          \
        !          1055:   extern pfunc __ctors[];                      \
        !          1056:   extern pfunc __ctors_end[];                  \
        !          1057:   pfunc *p;                                    \
        !          1058:   for (p = __ctors; p < __ctors_end; p++)      \
        !          1059:     {                                          \
        !          1060:       (*p)();                                  \
        !          1061:     }                                          \
        !          1062: }                                              
        !          1063: 
        !          1064: #undef DO_GLOBAL_DTORS_BODY                     
        !          1065: #define DO_GLOBAL_DTORS_BODY                    \
        !          1066: {                                              \
        !          1067:   typedef (*pfunc)();                          \
        !          1068:   extern pfunc __dtors[];                      \
        !          1069:   extern pfunc __dtors_end[];                  \
        !          1070:   pfunc *p;                                    \
        !          1071:   for (p = __dtors; p < __dtors_end; p++)      \
        !          1072:     {                                          \
        !          1073:       (*p)();                                  \
        !          1074:     }                                          \
        !          1075: }                                               
        !          1076: 
        !          1077: 
        !          1078: 
        !          1079: #define ASM_OUTPUT_REG_PUSH(file, v) \
        !          1080:   fprintf (file, "\tmov.l      r%s,-@r15\n", v);
        !          1081: 
        !          1082: #define ASM_OUTPUT_REG_POP(file, v) \
        !          1083:   fprintf (file, "\tmov.l      @r15+,r%s\n", v);
        !          1084: 
        !          1085: 
        !          1086:   
        !          1087: /* The assembler's names for the registers.  RFP need not always be used as
        !          1088:    the Real framepointer; it can also be used as a normal general register.
        !          1089:    Note that the name `fp' is horribly misleading since `fp' is in fact only
        !          1090:    the argument-and-return-context pointer.  */
        !          1091: #define REGISTER_NAMES                                 \
        !          1092: {                                                      \
        !          1093:   "r0", "r1", "r2",  "r3",  "r4",  "r5",  "r6",  "r7",         \
        !          1094:   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",        \
        !          1095:   "ap", "pr", "t",  "gbr", "mach","macl"               \
        !          1096: }
        !          1097: 
        !          1098: /* DBX register number for a given compiler register number */
        !          1099: #define DBX_REGISTER_NUMBER(REGNO)  (REGNO)
        !          1100: 
        !          1101: /* Output a label definition.  */
        !          1102: #define ASM_OUTPUT_LABEL(FILE,NAME)  \
        !          1103:   do { assemble_name (FILE, NAME); fputs (":\n", FILE); } while (0)
        !          1104: 
        !          1105: 
        !          1106: /* This is how to output an assembler line
        !          1107:    that says to advance the location counter
        !          1108:    to a multiple of 2**LOG bytes.  */
        !          1109: 
        !          1110: #define ASM_OUTPUT_ALIGN(FILE,LOG)     \
        !          1111:   if ((LOG) != 0)                      \
        !          1112:     fprintf (FILE, "\t.align %d\n", LOG)
        !          1113: 
        !          1114: /* Output a function label definition.  */
        !          1115: #define ASM_DECLARE_FUNCTION_NAME(STREAM,NAME,DECL) \
        !          1116:     ASM_OUTPUT_LABEL(STREAM, NAME)
        !          1117: 
        !          1118: /* Output a globalising directive for a label.  */
        !          1119: #define ASM_GLOBALIZE_LABEL(STREAM,NAME)  \
        !          1120:   (fprintf (STREAM, "\t.global\t"),      \
        !          1121:    assemble_name (STREAM, NAME),         \
        !          1122:    fputc ('\n',STREAM))                   \
        !          1123: 
        !          1124: /* Output a reference to a label.  */
        !          1125: #define ASM_OUTPUT_LABELREF(STREAM,NAME)  \
        !          1126:   fprintf (STREAM, "_%s", NAME)
        !          1127: 
        !          1128: /* Make an internal label into a string.  */
        !          1129: #define ASM_GENERATE_INTERNAL_LABEL(STRING, PREFIX, NUM)  \
        !          1130:   sprintf (STRING, "*%s%d", PREFIX, NUM)
        !          1131: 
        !          1132: /* Output an internal label definition.  */
        !          1133: #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM)     \
        !          1134:   fprintf (FILE, "%s%d:\n", PREFIX, NUM)
        !          1135: 
        !          1136: /* #define ASM_OUTPUT_CASE_END(STREAM,NUM,TABLE)           */
        !          1137: 
        !          1138: /* Construct a private name.  */
        !          1139: #define ASM_FORMAT_PRIVATE_NAME(OUTVAR,NAME,NUMBER)  \
        !          1140:   ((OUTVAR) = (char *) alloca (strlen (NAME) + 10),  \
        !          1141:    sprintf ((OUTVAR), "%s.%d", (NAME), (NUMBER)))
        !          1142: 
        !          1143: /* Jump tables must be 32 bit aligned. */
        !          1144: #define ASM_OUTPUT_CASE_LABEL(STREAM,PREFIX,NUM,TABLE) \
        !          1145:   fprintf (STREAM, "\t.align 2\n%s%d:\n", PREFIX, NUM);
        !          1146: 
        !          1147: /* Output a relative address. Not needed since jump tables are absolute
        !          1148:    but we must define it anyway.  */
        !          1149: #define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM,VALUE,REL)  \
        !          1150:   fputs ("- - - ASM_OUTPUT_ADDR_DIFF_ELT called!\n", STREAM)
        !          1151: 
        !          1152: /* Output an element of a dispatch table.  */
        !          1153: #define ASM_OUTPUT_ADDR_VEC_ELT(STREAM,VALUE)  \
        !          1154:     fprintf (STREAM, "\t.long\tL%d\n", VALUE)
        !          1155: 
        !          1156: /* Output various types of constants.  */
        !          1157: 
        !          1158: 
        !          1159: /* This is how to output an assembler line defining a `double' */
        !          1160: 
        !          1161: #define ASM_OUTPUT_DOUBLE(FILE,VALUE)                  \
        !          1162: do { char dstr[30];                                    \
        !          1163:      REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", dstr);   \
        !          1164:      fprintf (FILE, "\t.double %s\n", dstr);           \
        !          1165:    } while (0)
        !          1166: 
        !          1167: 
        !          1168: /* This is how to output an assembler line defining a `float' constant.  */
        !          1169: #define ASM_OUTPUT_FLOAT(FILE,VALUE)           \
        !          1170: do { char dstr[30];                                    \
        !          1171:      REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", dstr);   \
        !          1172:      fprintf (FILE, "\t.float %s\n", dstr);            \
        !          1173:    } while (0)
        !          1174: 
        !          1175: 
        !          1176: #define ASM_OUTPUT_INT(STREAM, EXP)    \
        !          1177:   (fprintf (STREAM, "\t.long\t"),              \
        !          1178:    output_addr_const (STREAM, (EXP)),          \
        !          1179:    fputc ('\n', STREAM))               
        !          1180: 
        !          1181: #define ASM_OUTPUT_SHORT(STREAM, EXP)  \
        !          1182:   (fprintf (STREAM, "\t.short\t"),     \
        !          1183:    output_addr_const (STREAM, (EXP)),  \
        !          1184:    fputc ('\n', STREAM))               
        !          1185: 
        !          1186: #define ASM_OUTPUT_CHAR(STREAM, EXP)   \
        !          1187:   (fprintf (STREAM, "\t.byte\t"),              \
        !          1188:    output_addr_const (STREAM, (EXP)),          \
        !          1189:    fputc ('\n', STREAM))
        !          1190: 
        !          1191: #define ASM_OUTPUT_BYTE(STREAM, VALUE)         \
        !          1192:   fprintf (STREAM, "\t.byte\t%d\n", VALUE)     \
        !          1193: 
        !          1194: /* This is how to output an assembler line
        !          1195:    that says to advance the location counter by SIZE bytes.  */
        !          1196: 
        !          1197: #define ASM_OUTPUT_SKIP(FILE,SIZE)  \
        !          1198:   fprintf (FILE, "\t.space %d\n", (SIZE))
        !          1199: 
        !          1200: /* This says how to output an assembler line
        !          1201:    to define a global common symbol.  */
        !          1202: 
        !          1203: #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED)  \
        !          1204: ( fputs ("\t.comm ", (FILE)),                  \
        !          1205:   assemble_name ((FILE), (NAME)),              \
        !          1206:   fprintf ((FILE), ",%d\n", (SIZE)))
        !          1207: 
        !          1208: /* This says how to output an assembler line
        !          1209:    to define a local common symbol.  */
        !          1210: 
        !          1211: #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE,ROUNDED)     \
        !          1212: ( fputs ("\t.lcomm ", (FILE)),                         \
        !          1213:   assemble_name ((FILE), (NAME)),                      \
        !          1214:   fprintf ((FILE), ",%d\n", (SIZE)))
        !          1215: 
        !          1216: 
        !          1217: /* The assembler's parentheses characters.  */
        !          1218: #define ASM_OPEN_PAREN "("
        !          1219: #define ASM_CLOSE_PAREN ")"
        !          1220: 
        !          1221: /* Target characters.  */
        !          1222: #define TARGET_BELL    007
        !          1223: #define TARGET_BS      010
        !          1224: #define TARGET_TAB     011
        !          1225: #define TARGET_NEWLINE 012
        !          1226: #define TARGET_VT      013
        !          1227: #define TARGET_FF      014
        !          1228: #define TARGET_CR      015
        !          1229: 
        !          1230: 
        !          1231: /* Only perform branch elimination (by making instructions conditional) if
        !          1232:    we're optimising.  Otherwise it's of no use anyway.  */
        !          1233: #define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS)  \
        !          1234:      final_prescan_insn (INSN, OPVEC, NOPERANDS)
        !          1235: 
        !          1236: /* Print operand X (an rtx) in assembler syntax to file FILE.
        !          1237:    CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
        !          1238:    For `%' followed by punctuation, CODE is the punctuation and X is null.  */
        !          1239: 
        !          1240: #define PRINT_OPERAND(STREAM, X, CODE)  print_operand (STREAM, X, CODE)
        !          1241: 
        !          1242: /* Print a memory address as an operand to reference that memory location.  */
        !          1243: 
        !          1244: #define PRINT_OPERAND_ADDRESS(STREAM,X)  print_operand_address (STREAM, X)
        !          1245: 
        !          1246: #define PRINT_OPERAND_PUNCT_VALID_P(CHAR) \
        !          1247:   ((CHAR)=='.' || (CHAR) == '#' || (CHAR) == '*' || (CHAR) == '^' || (CHAR) == '!')
        !          1248: 
        !          1249: 
        !          1250: /* Define the information needed to generate branch insns.  This is stored
        !          1251:    from the compare operation.  Note that we can't use "rtx" here since it
        !          1252:    hasn't been defined!  */
        !          1253: 
        !          1254: extern struct rtx_def *sh_compare_op0;
        !          1255: extern struct rtx_def *sh_compare_op1;
        !          1256: extern struct rtx_def *prepare_scc_operands();
        !          1257: 
        !          1258: extern enum attr_cpu sh_cpu;   /* target cpu */
        !          1259: 
        !          1260: /* Declare functions defined in sh.c and used in templates. */
        !          1261: 
        !          1262: extern char *output_branch();
        !          1263: extern char *output_shift();
        !          1264: extern char *output_movedouble();
        !          1265: extern char *output_movepcrel();
        !          1266: 
        !          1267: 
        !          1268: #define ADJUST_INSN_LENGTH(insn, length) \
        !          1269:   adjust_insn_length (insn, insn_lengths)
        !          1270: 
        !          1271: 
        !          1272: 
        !          1273: 
        !          1274: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.