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

unix.superglobalmegacorp.com

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