Annotation of gcc/config/1750a/1750a.h, revision 1.1.1.1

1.1       root        1: /* Definitions of target machine for GNU compiler.
                      2:    Copyright (C) 1994 Free Software Foundation, Inc.
                      3:    Contributed by O.M.Kellogg, DASA ([email protected]).
                      4: 
                      5: This file is part of GNU CC.
                      6: 
                      7: GNU CC is free software; you can redistribute it and/or modify
                      8: it under the terms of the GNU General Public License as published by
                      9: the Free Software Foundation; either version 1, or (at your option)
                     10: any later version.
                     11: 
                     12: GNU CC is distributed in the hope that it will be useful,
                     13: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     15: GNU General Public License for more details.
                     16: 
                     17: You should have received a copy of the GNU General Public License
                     18: along with GNU CC; see the file COPYING.  If not, write to
                     19: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
                     20: 
                     21: 
                     22: /* Names to predefine in the preprocessor for this target machine.  */
                     23: 
                     24: /* See tm-sun3.h, tm-sun2.h, tm-isi68.h for different CPP_PREDEFINES.  */
                     25: #define CPP_PREDEFINES ""
                     26: 
                     27: /* Print subsidiary information on the compiler version in use.  */
                     28: #ifdef IEEE
                     29: #define TARGET_VERSION fprintf (stderr, " (1750A, IEEE syntax)");
                     30: #else
                     31: #define TARGET_VERSION fprintf (stderr, " (MIL-STD-1750A)");
                     32: #endif
                     33: 
                     34: /* Run-time compilation parameters selecting different hardware subsets.  */
                     35: 
                     36: #define TARGET_SWITCHES  \
                     37:   { {"vaxc-alignment", 2}, \
                     38:     { "", TARGET_DEFAULT}}
                     39: 
                     40: /* Default target_flags if no switches specified.  */
                     41: 
                     42: #ifndef TARGET_DEFAULT
                     43: #define TARGET_DEFAULT 1
                     44: #endif
                     45: 
                     46: /*****************************************************************************/
                     47: 
                     48: /* SPECIAL ADDITION FOR MIL-STD-1750A     by O.M.Kellogg, 15-Apr-1993 */
                     49: /* See file aux-output.c for the actual data instances. */
                     50: struct datalabel_array {
                     51:     char *name;
                     52:     char value[14];
                     53:     int size;
                     54: };
                     55: struct jumplabel_array {
                     56:     int pc;
                     57:     int num;
                     58: };
                     59: enum section { Init, Normal, Konst, Static };
                     60: #define DATALBL_ARRSIZ 256
                     61: #define JMPLBL_ARRSIZ  256
                     62: #ifndef __datalbl
                     63: extern struct datalabel_array datalbl[];
                     64: extern struct jumplabel_array jmplbl[];
                     65: extern int datalbl_ndx, jmplbl_ndx, label_pending, program_counter;
                     66: extern enum section current_section;
                     67: extern char *sectname[4];
                     68: extern char *strdup(), *float_label();
                     69: #endif
                     70: /*--------------------------------------------------------------------*/
                     71: 
                     72: /* target machine storage layout */
                     73: 
                     74: /* Define this if most significant bit is lowest numbered
                     75:    in instructions that operate on numbered bit-fields.
                     76:    Though 1750 actually counts bits in big-endian fashion, the sign bit
                     77:    is still the most significant bit, which is leftmost. Therefore leaving
                     78:    this little-endian. Adjust short before assembler output when needed:
                     79:    e.g. in QImode, a GCC bit n is a 1750 bit (15-n). */
                     80: #define BITS_BIG_ENDIAN 0 
                     81: 
                     82: /* Define this if most significant byte of a word is the lowest numbered.  */
                     83: /* For 1750 we can decide arbitrarily
                     84:    since there are no machine instructions for them.  */
                     85: #define BYTES_BIG_ENDIAN 0
                     86: 
                     87: /* Define this if most significant word of a multiword value is lowest
                     88:    numbered.
                     89:    True for 1750. */
                     90: #define WORDS_BIG_ENDIAN 1
                     91: 
                     92: /* number of bits in an addressable storage unit */
                     93: #define BITS_PER_UNIT        16
                     94: 
                     95: /* Width in bits of a "word", which is the contents of a machine register.
                     96:    Note that this is not necessarily the width of data type `int';
                     97:    if using 16-bit ints on a 68000, this would still be 32.
                     98:    But on a machine with 16-bit registers, this would be 16.  */
                     99: #define BITS_PER_WORD        16
                    100: 
                    101: /* Width of a word, in units (bytes).  */
                    102: #define UNITS_PER_WORD       1
                    103: 
                    104: /* Width in bits of a pointer.
                    105:    See also the macro `Pmode' defined below.  */
                    106: #define POINTER_SIZE         16
                    107: 
                    108: #define PTRDIFF_TYPE        "int"
                    109: 
                    110: /* Type to use for `size_t'. If undefined, uses `long unsigned int'. */
                    111: #define SIZE_TYPE           "int"
                    112: 
                    113: /* 1750a preliminary
                    114:    #define TARGET_FLOAT_FORMAT UNKNOWN_FLOAT_FORMAT
                    115: */
                    116: 
                    117: /* Allocation boundary (in *bits*) for storing pointers in memory.  */
                    118: #define POINTER_BOUNDARY     16
                    119: 
                    120: /* Allocation boundary (in *bits*) for storing arguments in argument list.  */
                    121: /* 1750: should have had to make this 32 when BITS_PER_WORD is 32. */
                    122: #define PARM_BOUNDARY        16
                    123: 
                    124: /* Boundary (in *bits*) on which stack pointer should be aligned.  */
                    125: #define STACK_BOUNDARY       16
                    126: 
                    127: /* Allocation boundary (in *bits*) for the code of a function.  */
                    128: #define FUNCTION_BOUNDARY    16
                    129: 
                    130: /* Alignment of field after `int : 0' in a structure.  */
                    131: #define EMPTY_FIELD_BOUNDARY 16
                    132: 
                    133: /* No data type wants to be aligned rounder than this.  */
                    134: #define BIGGEST_ALIGNMENT    16
                    135: 
                    136: /* Define this to 1 if move instructions will actually fail to work
                    137:    when given unaligned data. */
                    138: #define STRICT_ALIGNMENT 0
                    139: 
                    140: /* Define number of bits in most basic integer type.
                    141:    (If undefined, default is BITS_PER_WORD).
                    142:    #define INT_TYPE_SIZE  16  */
                    143: 
                    144: /* Define number of bits in short integer type.
                    145:    (If undefined, default is half of BITS_PER_WORD). */
                    146: #define SHORT_TYPE_SIZE 16
                    147: 
                    148: /* Define number of bits in long integer type.
                    149:    (If undefined, default is BITS_PER_WORD). */
                    150: #define LONG_TYPE_SIZE  32
                    151: 
                    152: /* Define number of bits in long long integer type.
                    153:    (If undefined, default is twice BITS_PER_WORD). */
                    154: /* 1750 PRELIMINARY : no processor support for `long long', therefore
                    155:         need to check out the long-long opencodings ! */
                    156: #define LONG_LONG_TYPE_SIZE  64
                    157: 
                    158: /* Define number of bits in char type.
                    159:    (If undefined, default is one fourth of BITS_PER_WORD). */
                    160: #define CHAR_TYPE_SIZE  16
                    161: 
                    162: /* Define number of bits in float type.
                    163:    (If undefined, default is BITS_PER_WORD). */
                    164: #define FLOAT_TYPE_SIZE  32
                    165: 
                    166: /* Define number of bits in double type.
                    167:    (If undefined, default is twice BITS_PER_WORD). */
                    168: #define DOUBLE_TYPE_SIZE  48
                    169: 
                    170: /*****************************************************************************/
                    171: 
                    172: /* Standard register usage.  */
                    173: 
                    174: /* Number of actual hardware registers.
                    175:    The hardware registers are assigned numbers for the compiler
                    176:    from 0 to just below FIRST_PSEUDO_REGISTER.
                    177:    All registers that the compiler knows about must be given numbers,
                    178:    even those that are not normally considered general registers. */
                    179: #define FIRST_PSEUDO_REGISTER 16
                    180: 
                    181: /* 1 for registers that have pervasive standard uses
                    182:    and are not available for the register allocator.
                    183:    R15 is the 1750A stack pointer. R14 is the frame pointer. */
                    184: 
                    185: #define FIXED_REGISTERS  \
                    186:  { 0, 0, 0, 0, 0, 0, 0, 0, \
                    187:    0, 0, 0, 0, 0, 0, 1, 1 }
                    188: 
                    189: /* 1 for registers not available across function calls.
                    190:    These must include the FIXED_REGISTERS and also any
                    191:    registers that can be used without being saved.
                    192:    The latter must include the registers where values are returned
                    193:    and the register where structure-value addresses are passed.
                    194:    Aside from that, you can include as many other registers as you like.
                    195:    1750: return value in R0 foll. (depending on size of retval).
                    196:    Should be possible to refine this (how many regs are actually used) */
                    197: 
                    198: #define CALL_USED_REGISTERS \
                    199:  { 1, 1, 1, 1, 1, 1, 1, 1, \
                    200:    1, 1, 1, 1, 1, 1, 1, 1 }
                    201: 
                    202: /* Return number of consecutive hard regs needed starting at reg REGNO
                    203:    to hold something of mode MODE.
                    204:    This is ordinarily the length in words of a value of mode MODE
                    205:    but can be less for certain modes in special long registers.
                    206:    All 1750 registers are one word long. */
                    207: #define HARD_REGNO_NREGS(REGNO, MODE)   \
                    208:    ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
                    209: 
                    210: /* Value is 1 if hard register REGNO can hold a value of machine-mode MODE. */
                    211: #define HARD_REGNO_MODE_OK(REGNO, MODE) 1
                    212: 
                    213: /* Value is 1 if it is a good idea to tie two pseudo registers
                    214:    when one has mode MODE1 and one has mode MODE2.
                    215:    If HARD_REGNO_MODE_OK could produce different values for MODE1 and MODE2,
                    216:    for any hard reg, then this must be 0 for correct output. */
                    217: #define MODES_TIEABLE_P(MODE1, MODE2)  1
                    218: 
                    219: /* Specify the registers used for certain standard purposes.
                    220:    The values of these macros are register numbers.  */
                    221: 
                    222: /* 1750A pc isn't overloaded on a register.  */
                    223: /* #define PC_REGNUM  */
                    224: 
                    225: /* Register to use for pushing function arguments.  */
                    226: #define STACK_POINTER_REGNUM 15
                    227: 
                    228: /* Base register for access to local variables of the function.  */
                    229: #define FRAME_POINTER_REGNUM 14
                    230: 
                    231: /* Value should be nonzero if functions must have frame pointers.
                    232:    Zero means the frame pointer need not be set up (and parms
                    233:    may be accessed via the stack pointer) in functions that seem suitable.
                    234:    This is computed in `reload', in reload1.c. */
                    235: #define FRAME_POINTER_REQUIRED 1
                    236: 
                    237: /* Base register for access to arguments of the function.  */
                    238: #define ARG_POINTER_REGNUM 14
                    239: 
                    240: /* Define this if successive args to a function occupy decreasing addresses
                    241:    on the stack. 
                    242:    #define ARGS_GROW_DOWNWARD
                    243: */
                    244: 
                    245: /* Register in which static-chain is passed to a function. */
                    246: #define STATIC_CHAIN_REGNUM 13
                    247: 
                    248: /* Register in which address to store a structure value
                    249:    is passed to a function. */
                    250: #define STRUCT_VALUE_REGNUM 12
                    251: 
                    252: /* Define this to be 1 if all structure return values must be in memory. */
                    253: #define DEFAUT_PCC_STRUCT_RETURN 0
                    254: 
                    255: /*****************************************************************************/
                    256: 
                    257: /* Define the classes of registers for register constraints in the
                    258:    machine description.  Also define ranges of constants.
                    259: 
                    260:    One of the classes must always be named ALL_REGS and include all hard regs.
                    261:    If there is more than one class, another class must be named NO_REGS
                    262:    and contain no registers.
                    263: 
                    264:    The name GENERAL_REGS must be the name of a class (or an alias for
                    265:    another name such as ALL_REGS).  This is the class of registers
                    266:    that is allowed by "g" or "r" in a register constraint.
                    267:    Also, registers outside this class are allocated only when
                    268:    instructions express preferences for them.
                    269: 
                    270:    The classes must be numbered in nondecreasing order; that is,
                    271:    a larger-numbered class must never be contained completely
                    272:    in a smaller-numbered class.
                    273: 
                    274:    For any two classes, it is very desirable that there be another
                    275:    class that represents their union.  */
                    276: 
                    277: /* 1750 note: The names (BASE_REGS/INDEX_REGS) are used in their *gcc sense*
                    278:    (i.e. *opposite* to the MIL-STD-1750A defined meanings). This means that
                    279:    R1..R15 are called "base" regs and R12..R15 are "index" regs.
                    280:    Index reg mode (in the gcc sense) is not yet implemented (these are the
                    281:    1750 "Base with Index Reg" instructions, LBX etc. See 1750.md)
                    282: 
                    283:    Here's an example to drive this point home: in "LBX B12,R5"
                    284:    B12 shall be called the "index" reg and R5 shall be the "base" reg.
                    285:    This naming inversion is due to the GCC defined capabilities of
                    286:    "Base" vs. "Index" regs. */
                    287: 
                    288: enum reg_class { NO_REGS, INDEX_REGS, BASE_REGS, ALL_REGS, LIM_REG_CLASSES };
                    289: 
                    290: #define N_REG_CLASSES (int) LIM_REG_CLASSES
                    291: 
                    292: /* Since GENERAL_REGS is the same class as ALL_REGS,
                    293:    don't give it a different class number; just make it an alias. */
                    294: #define GENERAL_REGS ALL_REGS
                    295: 
                    296: /* Give names of register classes as strings for dump file.   */
                    297: 
                    298: #define REG_CLASS_NAMES \
                    299:  { "NO_REGS", "INDEX_REGS", "BASE_REGS", "ALL_REGS" }
                    300: 
                    301: /* Define which registers fit in which classes.
                    302:    This is an initializer for a vector of HARD_REG_SET
                    303:    of length N_REG_CLASSES.
                    304:    1750 "index" (remember, in the *GCC* sense!) regs are R12 through R15. 
                    305:    The only 1750 register not usable as BASE_REG is R0. */
                    306: 
                    307: #define REG_CLASS_CONTENTS  {0, 0xf000, 0xfffe, 0xffff}
                    308: 
                    309: /* The same information, inverted:
                    310:    Return the class number of the smallest class containing
                    311:    reg number REGNO.  This could be a conditional expression
                    312:    or could index an array.  */
                    313: #define REGNO_REG_CLASS(REGNO) \
                    314:  ((REGNO) >= 12 ? INDEX_REGS : (REGNO) >  0 ? BASE_REGS : ALL_REGS)
                    315: 
                    316: /* The class value for index registers, and the one for base regs. */
                    317: 
                    318: #define BASE_REG_CLASS  BASE_REGS
                    319: #define INDEX_REG_CLASS INDEX_REGS
                    320: 
                    321: /* Get reg_class from a letter such as appears in the machine description.
                    322:    For the 1750, we have 'b' for gcc Base regs and 'x' for gcc Index regs. */
                    323: 
                    324: #define REG_CLASS_FROM_LETTER(C) ((C) == 'b' ? BASE_REGS : \
                    325:                                  (C) == 'x' ? INDEX_REGS : NO_REGS)
                    326: 
                    327: /* The letters I,J,K,.. to P in a register constraint string
                    328:    can be used to stand for particular ranges of immediate operands.
                    329:    This macro defines what the ranges are.
                    330:    C is the letter, and VALUE is a constant value.
                    331:    Return 1 if VALUE is in the range specified by C.
                    332: 
                    333:    For the 1750A, 
                    334:    `I' is used for ISP mode instructions,
                    335:    `J' is used for ISN mode instructions,
                    336:    `K' is used for the STC instruction's constant range,
                    337:    `L' is used for unsigned 8-bit address displacements in instructions
                    338:        of addressing mode "Base Relative",
                    339:    `M' is for IM mode instructions et al.,
                    340:    `O' is a synonym for (const_int 0). */
                    341: 
                    342: #define CONST_OK_FOR_LETTER_P(VALUE, C)                                \
                    343:   ((C) == 'I' ? (VALUE) > 0 && (VALUE) <=  16 :                        \
                    344:    (C) == 'J' ? (VALUE) < 0 && (VALUE) >= -16 :                        \
                    345:    (C) == 'K' ? (VALUE) >= 0 && (VALUE) <= 15 :                        \
                    346:    (C) == 'L' ? (VALUE) >= 0 && (VALUE) <= 0xFF :              \
                    347:    (C) == 'M' ? (VALUE) >= -0x8000 && (VALUE) <= 0x7FFF :      \
                    348:    (C) == 'O' ? (VALUE) == 0 :                         0)
                    349: 
                    350: /* Similar, but for floating constants, and defining letter 'G'.
                    351:    Here VALUE is the CONST_DOUBLE rtx itself.  */
                    352: #define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C)  0
                    353: 
                    354: /* Given an rtx X being reloaded into a reg required to be
                    355:    in class CLASS, return the class of reg to actually use.
                    356:    In general this is just CLASS; but on some machines
                    357:    in some cases it is preferable to use a more restrictive class.
                    358:    For the 1750A, we force an immediate CONST_DOUBLE value to memory. */
                    359: #define PREFERRED_RELOAD_CLASS(X,CLASS)  \
                    360:                (GET_CODE(X) == CONST_DOUBLE ? NO_REGS : CLASS)
                    361: 
                    362: /* Return the maximum number of consecutive registers
                    363:    needed to represent mode MODE in a register of class CLASS.
                    364:    On the 1750A, this is the size of MODE in words,
                    365:    since class doesn't make any difference. */
                    366: #define CLASS_MAX_NREGS(CLASS,MODE)  GET_MODE_SIZE(MODE)
                    367: 
                    368: /*****************************************************************************/
                    369: 
                    370: /* Stack layout; function entry, exit and calling.  */
                    371: 
                    372: /* Define this if pushing a word on the stack
                    373:    makes the stack pointer a smaller address.  */
                    374: #define STACK_GROWS_DOWNWARD 1
                    375: 
                    376: /* Define this if the nominal address of the stack frame
                    377:    is at the high-address end of the local variables;
                    378:    goes at a more negative offset in the frame. 
                    379:    #define FRAME_GROWS_DOWNWARD
                    380: */
                    381: 
                    382: /* Offset within stack frame to start allocating local variables at.
                    383:    If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
                    384:    first local allocated.  Otherwise, it is the offset to the BEGINNING
                    385:    of the first local allocated.
                    386: */
                    387: #define STARTING_FRAME_OFFSET 1
                    388: 
                    389: /* This is the default anyway:
                    390:    #define DYNAMIC_CHAIN_ADDRESS(FRAMEADDR) FRAMEADDR
                    391: */
                    392: 
                    393: /* If we generate an insn to push BYTES bytes,
                    394:    this says how many the stack pointer really advances by.
                    395:    1750 note: what GCC calls a "byte" is really a 16-bit word,
                    396:    because BITS_PER_UNIT is 16. */
                    397: 
                    398: #define PUSH_ROUNDING(BYTES) (BYTES)
                    399: 
                    400: /* Define this macro if functions should assume that stack space has
                    401:    been allocated for arguments even when their values are passed in
                    402:    registers.
                    403:    Size, in bytes, of the area reserved for arguments passed in
                    404:    registers for the function represented by FNDECL. 
                    405:    #define REG_PARM_STACK_SPACE(FNDECL) 14 */
                    406: 
                    407: /* Define this if it is the responsibility of the caller to allocate
                    408:    the area reserved for arguments passed in registers. 
                    409:    #define OUTGOING_REG_PARM_STACK_SPACE */
                    410: 
                    411: /* Offset of first parameter from the argument pointer register value.
                    412:    1750 note:
                    413:    Parameters appear in reversed order on the frame (so when they are
                    414:    popped, they come off in the normal left-to-right order.)
                    415:    Computed as follows:
                    416:    one word for the caller's (PC+1) (i.e. the return address)
                    417:    plus total size of called function's "auto" variables
                    418:    plus one word for the caller's frame pointer (i.e. the old FP) */
                    419: 
                    420: #define FIRST_PARM_OFFSET(FNDECL) \
                    421:    (1 + get_frame_size() + 1)
                    422: 
                    423: /* Value is 1 if returning from a function call automatically
                    424:    pops the arguments described by the number-of-args field in the call.
                    425:    FUNTYPE is the data type of the function (as a tree),
                    426:    or for a library call it is an identifier node for the subroutine name.
                    427: */
                    428: 
                    429: #define RETURN_POPS_ARGS(FUNTYPE,SIZE) 0
                    430: 
                    431: /* Define how to find the value returned by a function.
                    432:    VALTYPE is the data type of the value (as a tree).
                    433:    If the precise function being called is known, FUNC is its FUNCTION_DECL;
                    434:    otherwise, FUNC is 0. */
                    435: 
                    436: #define FUNCTION_VALUE(VALTYPE, FUNC)  \
                    437:   gen_rtx(REG,TYPE_MODE(VALTYPE),0)
                    438: 
                    439: /* Define how to find the value returned by a library function
                    440:    assuming the value has mode MODE. */
                    441: /* 1750 note: no libcalls yet */
                    442: 
                    443: #define LIBCALL_VALUE(MODE)  printf("LIBCALL_VALUE called!\n"), \
                    444:   gen_rtx(REG,MODE,0)
                    445: 
                    446: /* 1 if N is a possible register number for a function value. */
                    447: 
                    448: #define FUNCTION_VALUE_REGNO_P(N)  ((N) == 0)
                    449: 
                    450: /* 1 if the tree TYPE should be returned in memory instead of in regs. 
                    451:    #define RETURN_IN_MEMORY(TYPE) \
                    452:    (int_size_in_bytes(TYPE) > 12)
                    453: */
                    454: 
                    455: /* Define this if PCC uses the nonreentrant convention for returning
                    456:    structure and union values. 
                    457:    #define PCC_STATIC_STRUCT_RETURN  */
                    458: 
                    459: /* 1 if N is a possible register number for function argument passing. */
                    460: 
                    461: #define FUNCTION_ARG_REGNO_P(N)  ((N) < 12)
                    462: 
                    463: /*****************************************************************************/
                    464: 
                    465: /* Define a data type for recording info about an argument list
                    466:    during the scan of that argument list.  This data type should
                    467:    hold all necessary information about the function itself
                    468:    and about the args processed so far, enough to enable macros
                    469:    such as FUNCTION_ARG to determine where the next arg should go.
                    470: 
                    471:    For 1750A, this is a single integer, which is a number of words
                    472:    of arguments scanned so far.  */
                    473: 
                    474: #define CUMULATIVE_ARGS int
                    475: 
                    476: /* Initialize a variable CUM of type CUMULATIVE_ARGS
                    477:    for a call to a function whose data type is FNTYPE.
                    478:    For a library call, FNTYPE is 0.
                    479: 
                    480:    For 1750A, the offset starts at 0.  */
                    481: 
                    482: #define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME)   ((CUM) = 0)
                    483: 
                    484: /* Update the data in CUM to advance over an argument
                    485:    of mode MODE and data type TYPE.
                    486:    (TYPE is null for libcalls where that information may not be available.)
                    487: 
                    488:    1750 note: "int_size_in_bytes()" returns a unit relative to
                    489:    BITS_PER_UNIT, so in our case not bytes, but 16-bit words.  */
                    490: 
                    491: #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED)   \
                    492:  ((CUM) += (MODE) == BLKmode ? int_size_in_bytes(TYPE) : GET_MODE_SIZE(MODE))
                    493: 
                    494: /* Define where to put the arguments to a function.
                    495:    Value is zero to push the argument on the stack,
                    496:    or a hard register in which to store the argument.
                    497: 
                    498:    MODE is the argument's machine mode.
                    499:    TYPE is the data type of the argument (as a tree).
                    500:     This is null for libcalls where that information may
                    501:     not be available.
                    502:    CUM is a variable of type CUMULATIVE_ARGS which gives info about
                    503:     the preceding args and about the function being called.
                    504:    NAMED is nonzero if this argument is a named parameter
                    505:     (otherwise it is an extra parameter matching an ellipsis).  */
                    506: 
                    507: #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
                    508:        (rtx) function_arg(CUM,MODE,TYPE,NAMED)
                    509: /*
                    510:  (! MUST_PASS_IN_STACK(MODE,TYPE) &&                           \
                    511:   14 >= (CUM) +                                                        \
                    512:   ((MODE)==BLKmode ? int_size_in_bytes(TYPE) : GET_MODE_SIZE (MODE))  \
                    513:  ? gen_rtx (REG, MODE, CUM)                                    \
                    514:  : 0)
                    515: */
                    516: 
                    517: /* Define the following macro if function calls on the target machine
                    518:    do not preserve any registers; in other words, if `CALL_USED_REGISTERS'
                    519:    has 1 for all registers. This macro enables `-fcaller-saves' by
                    520:    default. Eventually that option will be nabled by default on all
                    521:    machines and both the option and this macro will be eliminated. */
                    522: 
                    523: #define DEFAULT_CALLER_SAVES
                    524: 
                    525: 
                    526: /* This macro generates the assembly code for function entry.
                    527:    FILE is a stdio stream to output the code to.
                    528:    SIZE is an int: how many units of temporary storage to allocate.
                    529:    Refer to the array `regs_ever_live' to determine which registers
                    530:    to save; `regs_ever_live[I]' is nonzero if register number I
                    531:    is ever used in the function.  This macro is responsible for
                    532:    knowing which registers should not be saved even if used.  */
                    533: 
                    534: 
                    535: #define FUNCTION_PROLOGUE(FILE, SIZE) {   \
                    536:   register int regno, none_used=1;                             \
                    537:   extern char call_used_regs[];                                        \
                    538:   fprintf(FILE, "; regs used in this function: ");             \
                    539:   for (regno = 0; regno < 15; regno++)                         \
                    540:     if (regs_ever_live[regno]) {                               \
                    541:        fprintf(FILE," %s",reg_names[regno]);                   \
                    542:        none_used = 0;                                          \
                    543:     }                                                          \
                    544:   if (none_used)                                               \
                    545:     fprintf(FILE," (none)");                                   \
                    546:   fprintf(FILE,"\n");                                          \
                    547:   if (SIZE > 0)                                                        \
                    548:     fprintf(FILE,"\t%s\tr15,%d  ; reserve local-variable space\n",\
                    549:                         (SIZE <= 16 ? "sisp" : "sim"),SIZE);   \
                    550:   fprintf(FILE,"\tpshm\tr14,r14 ; push old frame\n");          \
                    551:   fprintf(FILE,"\tlr\tr14,r15 ; set new frame\n");             \
                    552:   program_counter = 0; jmplbl_ndx = -1;                                \
                    553: }
                    554: 
                    555: /************* 1750: PROFILER HANDLING NOT YET DONE !!!!!!! *************/
                    556: /* Output assembler code to FILE to increment profiler label # LABELNO
                    557:    for profiling a function entry.  */
                    558: 
                    559: #define FUNCTION_PROFILER(FILE, LABELNO)  \
                    560:   fprintf (FILE, "; got into FUNCTION_PROFILER with label # %d\n", (LABELNO))
                    561: 
                    562: /* Output assembler code to FILE to initialize this source file's
                    563:    basic block profiling info, if that has not already been done.  */
                    564: #define FUNCTION_BLOCK_PROFILER(FILE, LABELNO)  \
                    565:   fprintf (FILE, "; got into FUNCTION_BLOCK_PROFILER with label # %d\n",LABELNO)
                    566: 
                    567: /* Output assembler code to FILE to increment the entry-count for
                    568:    the BLOCKNO'th basic block in this source file.  */
                    569: #define BLOCK_PROFILER(FILE, BLOCKNO)  \
                    570:   fprintf (FILE, "; got into BLOCK_PROFILER with block # %d\n",BLOCKNO)
                    571: 
                    572: /* EXIT_IGNORE_STACK should be nonzero if, when returning from a function,
                    573:    the stack pointer does not matter.  The value is tested only in
                    574:    functions that have frame pointers.
                    575:    No definition is equivalent to always zero.  */
                    576: 
                    577: #define EXIT_IGNORE_STACK 1
                    578: 
                    579: /* This macro generates the assembly code for function exit,
                    580:    on machines that need it.  If FUNCTION_EPILOGUE is not defined
                    581:    then individual return instructions are generated for each
                    582:    return statement.  Args are same as for FUNCTION_PROLOGUE.
                    583: 
                    584:    The function epilogue should not depend on the current stack pointer!
                    585:    It should use the frame pointer only.  This is mandatory because
                    586:    of alloca; we also take advantage of it to omit stack adjustments
                    587:    before returning. */
                    588: 
                    589: #define FUNCTION_EPILOGUE(FILE, SIZE) {                        \
                    590:   if (SIZE > 0)                                                        \
                    591:     fprintf(FILE,"\t%s\tr14,%d ; free up local-var space\n",   \
                    592:                         (SIZE <= 16 ? "aisp" : "aim"),SIZE);   \
                    593:   fprintf(FILE,"\tlr\tr15,r14 ; set stack to return addr\n");  \
                    594:   fprintf(FILE,"\tpopm\tr14,r14 ; restore prev. frame ptr\n"); \
                    595:   fprintf(FILE,"\turs\tr15\n"); }
                    596: 
                    597: /* If the memory address ADDR is relative to the frame pointer,
                    598:    correct it to be relative to the stack pointer instead.
                    599:    This is for when we don't use a frame pointer.
                    600:    ADDR should be a variable name. */
                    601: 
                    602: #define FIX_FRAME_POINTER_ADDRESS(ADDR,DEPTH)  \
                    603:    fprintf(stderr,"FIX_FRAME_POINTER_ADDRESS called, DEPTH=%d\n"), \
                    604:            DEPTH), abort()
                    605: 
                    606: /* Store in the variable DEPTH the initial difference between the
                    607:    frame pointer reg contents and the stack pointer reg contents,
                    608:    as of the start of the function body.  This depends on the layout
                    609:    of the fixed parts of the stack frame and on how registers are saved.
                    610: */
                    611: #define INITIAL_FRAME_POINTER_OFFSET(DEPTH) DEPTH = 0
                    612: 
                    613: /* 1750: not needed 'cause we have INITIAL_FRAME_POINTER_OFFSET.
                    614:    #define ELIMINABLE_REGS { \
                    615:        { ARG_POINTER_REGNUM, STACK_POINTER_REGNUM },  \
                    616:        { ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM },  \
                    617:        { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM } }
                    618: 
                    619:    #define CAN_ELIMINATE(FROM, TO)   1
                    620: 
                    621:    #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) { OFFSET = 0; }
                    622: */
                    623: 
                    624: 
                    625: /* Output assembler code for a block containing the constant parts
                    626:    of a trampoline, leaving space for the variable parts.  */
                    627: 
                    628: #define TRAMPOLINE_TEMPLATE(FILE)  fprintf(FILE,"TRAMPOLINE_TEMPLATE called\n")
                    629: 
                    630: /* Length in units of the trampoline for entering a nested function.  */
                    631: 
                    632: #define TRAMPOLINE_SIZE 2
                    633: 
                    634: /* Emit RTL insns to initialize the variable parts of a trampoline.
                    635:    FNADDR is an RTX for the address of the function's pure code.
                    636:    CXT is an RTX for the static chain value for the function.  */
                    637: 
                    638: #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT)  printf("INITIALIZE_TRAMPO called\n")
                    639: /* {                                                                   \
                    640:   emit_move_insn (gen_rtx (MEM, QImode, plus_constant (TRAMP, 1)), CXT); \
                    641:   emit_move_insn (gen_rtx (MEM, QImode, plus_constant (TRAMP, 6)), FNADDR); \
                    642: } */
                    643: 
                    644: 
                    645: /*****************************************************************************/
                    646: 
                    647: /* Addressing modes, and classification of registers for them.  */
                    648: 
                    649: /* 1750 doesn't have a lot of auto-incr./decr. - just for the stack ptr. */
                    650: 
                    651: /* #define HAVE_POST_INCREMENT  just for R15 (stack pointer) */
                    652: /* #define HAVE_POST_DECREMENT */
                    653: /* #define HAVE_PRE_DECREMENT   just for R15 (stack pointer) */
                    654: /* #define HAVE_PRE_INCREMENT */
                    655: 
                    656: /* Macros to check register numbers against specific register classes.  */
                    657: 
                    658: /* These assume that REGNO is a hard or pseudo reg number.
                    659:    They give nonzero only if REGNO is a hard reg of the suitable class
                    660:    or a pseudo reg currently allocated to a suitable hard reg.
                    661:    Since they use reg_renumber, they are safe only once reg_renumber
                    662:    has been allocated, which happens in local-alloc.c. 
                    663:    1750 note: The words BASE and INDEX are used in their GCC senses:
                    664:    The "Index Registers", R12 through R15, can have an address displacement
                    665:    int the range 0..255 words.
                    666:    */
                    667: 
                    668: #define REGNO_OK_FOR_BASE_P(REGNO)  \
                    669:  ((REGNO) > 0 && (REGNO) <= 15 ||   \
                    670:   reg_renumber[REGNO] > 0 && reg_renumber[REGNO] < 15)
                    671: #define REGNO_OK_FOR_INDEX_P(REGNO) \
                    672:  ((REGNO) >= 12 && (REGNO) <= 15 || \
                    673:   reg_renumber[REGNO] >= 12 && reg_renumber[REGNO] <= 15)
                    674: 
                    675: /* Now macros that check whether X is a register and also,
                    676:    strictly, whether it is in a specified class.
                    677: 
                    678: /* 1 if X is an address register  */
                    679: 
                    680: #define ADDRESS_REG_P(X) (REG_P (X) && REGNO_OK_FOR_BASE_P (REGNO (X)))
                    681: 
                    682: /* Maximum number of registers that can appear in a valid memory address.  */
                    683: #define MAX_REGS_PER_ADDRESS 1
                    684: 
                    685: /* Recognize any constant value that is a valid address.  */
                    686: 
                    687: #define CONSTANT_ADDRESS_P(X)  CONSTANT_P(X)
                    688: 
                    689: /* Nonzero if the constant value X is a legitimate general operand.
                    690:    It is given that X satisfies CONSTANT_P or is a CONST_DOUBLE.  */
                    691: 
                    692: #define LEGITIMATE_CONSTANT_P(X) 1
                    693: 
                    694: /* The macros REG_OK_FOR..._P assume that the arg is a REG rtx
                    695:    and check its validity for a certain class.
                    696:    We have two alternate definitions for each of them.
                    697:    The usual definition accepts all pseudo regs; the other rejects
                    698:    them unless they have been allocated suitable hard regs.
                    699:    The symbol REG_OK_STRICT causes the latter definition to be used.
                    700: 
                    701:    Most source files want to accept pseudo regs in the hope that
                    702:    they will get allocated to the class that the insn wants them to be in.
                    703:    Source files for reload pass need to be strict.
                    704:    After reload, it makes no difference, since pseudo regs have
                    705:    been eliminated by then.  */
                    706: 
                    707: #ifdef REG_OK_STRICT
                    708: 
                    709: /* Nonzero if X is a hard reg that can be used as an index.  */
                    710: #define REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P (REGNO (X))
                    711: /* Nonzero if X is a hard reg that can be used as a base reg.  */
                    712: #define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X))
                    713: 
                    714: #else
                    715: 
                    716: /* Nonzero if X is a hard reg that can be used as an index
                    717:    or if it is a pseudo reg.  */
                    718: #define REG_OK_FOR_INDEX_P(X) (REGNO (X) >= 12)
                    719: /* Nonzero if X is a hard reg that can be used as a base reg
                    720:    or if it is a pseudo reg.  */
                    721: #define REG_OK_FOR_BASE_P(X) (REGNO (X) > 0)
                    722: 
                    723: #endif
                    724: 
                    725: 
                    726: /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
                    727:    that is a valid memory address for an instruction.
                    728:    The MODE argument is the machine mode for the MEM expression
                    729:    that wants to use this address.
                    730:    The other macros defined here are used only in GO_IF_LEGITIMATE_ADDRESS.
                    731: 
                    732:    1750 note: Currently we don't implement address expressions that use
                    733:    GCC "Index"-class regs. To be expanded to handle the 1750 "Base with Index"
                    734:    instructions (see also MAX_REGS_PER_ADDRESS and others). */
                    735: 
                    736: #define GO_IF_BASED_ADDRESS(X, ADDR) {                                 \
                    737:    if ((GET_CODE (X) == REG && REG_OK_FOR_BASE_P(X)))                  \
                    738:      goto ADDR;                                                                \
                    739:    if (GET_CODE (X) == PLUS)                                           \
                    740:     { register rtx x0 = XEXP(X,0), x1 = XEXP(X,1);                     \
                    741:       if ((REG_P(x0) && REG_OK_FOR_BASE_P(x0) && CONSTANT_ADDRESS_P(x1)) \
                    742:        || (REG_P(x1) && REG_OK_FOR_BASE_P(x1) && CONSTANT_ADDRESS_P(x0))) \
                    743:      goto ADDR; } }
                    744: 
                    745: #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) {                      \
                    746:        if (CONSTANT_ADDRESS_P(X)) goto ADDR;                           \
                    747:        GO_IF_BASED_ADDRESS(X,ADDR) }
                    748: 
                    749: 
                    750: /* Try machine-dependent ways of modifying an illegitimate address
                    751:    to be legitimate.  If we find one, return the new, valid address.
                    752:    This macro is used in only one place: `memory_address' in explow.c.
                    753: 
                    754:    OLDX is the address as it was before break_out_memory_refs was called.
                    755:    In some cases it is useful to look at this to decide what needs to be done.
                    756: 
                    757:    MODE and WIN are passed so that this macro can use
                    758:    GO_IF_LEGITIMATE_ADDRESS.
                    759: 
                    760:    It is always safe for this macro to do nothing.  It exists to recognize
                    761:    opportunities to optimize the output. */
                    762: 
                    763: #define LEGITIMIZE_ADDRESS(X,OLDX,MODE,WIN)
                    764: 
                    765: /* Go to LABEL if ADDR (a legitimate address expression)
                    766:    has an effect that depends on the machine mode it is used for.
                    767:    On the 68000, only predecrement and postincrement address depend thus
                    768:    (the amount of decrement or increment being the length of the operand).  */
                    769: /* 1750: not used. */
                    770: 
                    771: #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
                    772: 
                    773: /*****************************************************************************/
                    774: 
                    775: /* Specify the machine mode that this machine uses
                    776:    for the index in the tablejump instruction.  */
                    777: #define CASE_VECTOR_MODE QImode
                    778: 
                    779: /* Define this if the tablejump instruction expects the table
                    780:    to contain offsets from the address of the table.
                    781:    Do not define this if the table should contain absolute addresses. */
                    782: /* #define CASE_VECTOR_PC_RELATIVE */
                    783: 
                    784: /* Specify the tree operation to be used to convert reals to integers.  */
                    785: #define IMPLICIT_FIX_EXPR FIX_ROUND_EXPR
                    786: 
                    787: /* This is the kind of divide that is easiest to do in the general case.  */
                    788: #define EASY_DIV_EXPR TRUNC_DIV_EXPR
                    789: 
                    790: /* Define this as 1 if `char' should by default be signed; else as 0.  */
                    791: #define DEFAULT_SIGNED_CHAR 0
                    792: 
                    793: /* Max number of bytes we can move from memory to memory
                    794:    in one reasonably fast instruction.  */
                    795: /* (was: "1750: not counting the MOV instruction") */
                    796: #define MOVE_MAX 16
                    797: 
                    798: /* Define this if zero-extension is slow (more than one real instruction).  */
                    799: /* #define SLOW_ZERO_EXTEND */
                    800: 
                    801: /* Nonzero if access to memory by bytes is slow and undesirable.  */
                    802: #define SLOW_BYTE_ACCESS 0
                    803: 
                    804: /* Define if shifts truncate the shift count
                    805:    which implies one can omit a sign-extension or zero-extension
                    806:    of a shift count. */
                    807: /* #define SHIFT_COUNT_TRUNCATED 1 */
                    808: 
                    809: /* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
                    810:    is done just by pretending it is already truncated.  */
                    811: #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
                    812: 
                    813: /* We assume that the store-condition-codes instructions store 0 for false
                    814:    and some other value for true.  This is the value stored for true.  */
                    815: 
                    816: #define STORE_FLAG_VALUE 1
                    817: 
                    818: /* When a prototype says `char' or `short', really pass an `int'. 
                    819:    1750: for now, `char' is 16 bits wide anyway.
                    820:    #define PROMOTE_PROTOTYPES */
                    821: 
                    822: /* Specify the machine mode that pointers have.
                    823:    After generation of rtl, the compiler makes no further distinction
                    824:    between pointers and any other objects of this machine mode.  */
                    825: #define Pmode QImode
                    826: 
                    827: /* A function address in a call instruction
                    828:    is a 16-bit address (for indexing purposes) */
                    829: #define FUNCTION_MODE QImode
                    830: 
                    831: /* Compute the cost of computing a constant rtl expression RTX
                    832:    whose rtx-code is CODE.  The body of this macro is a portion
                    833:    of a switch statement.  If the code is computed here,
                    834:    return it with a return statement.  Otherwise, break from the switch.  */
                    835: /* 1750 note: haven't paid attention to this yet. */
                    836: 
                    837: #define CONST_COSTS(RTX,CODE,OUTER_CODE) \
                    838:   case CONST_INT:                                              \
                    839:     if (INTVAL(RTX) >= -16 && INTVAL(RTX) <= 16) return 1;     \
                    840:   case CONST:                                                  \
                    841:   case LABEL_REF:                                              \
                    842:   case SYMBOL_REF:                                             \
                    843:     return 5;                                                  \
                    844:   case CONST_DOUBLE:                                           \
                    845:     return 7;
                    846: 
                    847: #define ADDRESS_COST(ADDRESS)  (memop_valid(ADDRESS) ?  3 : 1000)
                    848: 
                    849: /* Tell final.c how to eliminate redundant test instructions.  */
                    850: 
                    851: /* Here we define machine-dependent flags and fields in cc_status
                    852:    (see `conditions.h').  */
                    853: /* MIL-STD-1750: none -- just has the garden variety C,P,Z,N flags. */
                    854: 
                    855: /* Store in cc_status the expressions
                    856:    that the condition codes will describe
                    857:    after execution of an instruction whose pattern is EXP.
                    858:    Do not alter them if the instruction would not alter the cc's.
                    859:    1750: See file out-1750a.c for notice_update_cc().  */
                    860: 
                    861: #define NOTICE_UPDATE_CC(EXP, INSN) notice_update_cc(EXP)
                    862: 
                    863: /**********************************************/
                    864: /* Produce debugging info in the DWARF format 
                    865:    #define DWARF_DEBUGGING_INFO
                    866: */
                    867: 
                    868: /*****************************************************************************/
                    869: 
                    870: /* Control the assembler format that we output.  */
                    871: 
                    872: /* Output at beginning of assembler file.  */
                    873: 
                    874: #define ASM_FILE_START(FILE)   {                                       \
                    875:    char *p, name[40];                                                  \
                    876:    if ((p = (char *)strrchr(main_input_filename,'/')) != NULL ? 1 :    \
                    877:        (p = (char *)strrchr(main_input_filename,']')) != NULL)         \
                    878:        p++;                                                            \
                    879:    else                                                                        \
                    880:        p = main_input_filename;                                        \
                    881:    strcpy(name,p);                                                     \
                    882:    if (p = (char *)strchr(name,'.'))                                   \
                    883:        *p = '\0';                                                      \
                    884:    fprintf(FILE,"\tname %s\n",name);                                   \
                    885:    fprintf(FILE,"\tnolist\n\tinclude \"ms1750.inc\"\n\tlist\n\n");     \
                    886:    fprintf(FILE,"\tglobal\t__main\n\n");  }
                    887: 
                    888: /* Output at end of assembler file.  
                    889:    For 1750, we copy the data labels accrued in datalbl[] from the Constants 
                    890:    section (Konst) to the Writable-Data section (Static).     */
                    891: 
                    892: #define ASM_FILE_END(FILE)     \
                    893:    do {                                                                        \
                    894:       if (datalbl_ndx >= 0) {                                          \
                    895:          int i, cum_size=0;                                            \
                    896:          fprintf(FILE,"\n\tstatic\ninit_srel\n");                      \
                    897:          for (i = 0; i <= datalbl_ndx; i++) {                          \
                    898:            if (datalbl[i].name == NULL)                                \
                    899:            {                                                           \
                    900:               fprintf(stderr, "asm_file_end internal datalbl err\n");  \
                    901:               exit (0);                                                \
                    902:            }                                                           \
                    903:             fprintf(FILE,"%s \tblock %d\n",                            \
                    904:                  datalbl[i].name,datalbl[i].size);                     \
                    905:             cum_size += datalbl[i].size;                               \
                    906:         }                                                              \
                    907:          fprintf(FILE,"\n\tinit\n");                                   \
                    908:          fprintf(FILE,"\tlim\tr0,init_srel\n");           /* destin. */        \
                    909:          fprintf(FILE,"\tlim\tr1,%d\n",cum_size);         /* count */  \
                    910:          fprintf(FILE,"\tlim\tr2,K%s\n",datalbl[0].name); /* source */ \
                    911:          fprintf(FILE,"\tmov\tr0,r2\n");                               \
                    912:          fprintf(FILE,"\n\tnormal\n");                                 \
                    913:          datalbl_ndx = -1;                     /* reset stuff */       \
                    914:          for (i = 0; i < DATALBL_ARRSIZ; i++)                          \
                    915:             datalbl[i].size = 0;                                       \
                    916:       }                                                                        \
                    917:       fprintf(FILE,"\n\tend\n");                                       \
                    918:    } while (0)
                    919: 
                    920: /* Output to assembler file text saying following lines
                    921:    may contain character constants, extra white space, comments, etc.  */
                    922: 
                    923: #define ASM_APP_ON "\n\tif 0\n; by ASM_APP_ON\n"
                    924: 
                    925: /* Output to assembler file text saying following lines
                    926:    no longer contain unusual constructs.  */
                    927: 
                    928: #define ASM_APP_OFF "\n\tendif\n"
                    929: 
                    930: 
                    931: #define EXTRA_SECTIONS  in_readonly_data
                    932: 
                    933: #define EXTRA_SECTION_FUNCTIONS                \
                    934:     void const_section()                               \
                    935:     {                                                  \
                    936:        fprintf(asm_out_file,"\tkonst\n");              \
                    937:        current_section = Konst;                                \
                    938:     }                                                  \
                    939:     check_section(enum section sect)                   \
                    940:     {                                                  \
                    941:         if (current_section != sect) {                 \
                    942:            fprintf(asm_out_file,"\t%s\n",sectname[(int)sect]); \
                    943:            current_section = sect;                     \
                    944:        }                                               \
                    945:        switch (sect) {                                 \
                    946:          case Init:                                    \
                    947:          case Normal:                                  \
                    948:            in_section = in_text;                       \
                    949:            break;                                      \
                    950:          case Static:                                  \
                    951:            in_section = in_data;                       \
                    952:            break;                                      \
                    953:          case Konst:                                   \
                    954:            in_section = in_readonly_data;              \
                    955:            break;                                      \
                    956:        }                                               \
                    957:     }
                    958: 
                    959:                
                    960: /* Function that switches to the read-only data section (optional) */
                    961: #define READONLY_DATA_SECTION  const_section
                    962: 
                    963: /* Output before program init section */
                    964: #define INIT_SECTION_ASM_OP "\n\tinit     ; init_section\n"
                    965: 
                    966: /* Output before program text section */
                    967: #define TEXT_SECTION_ASM_OP "\n\tnormal   ; text_section\n"
                    968: 
                    969: /* Output before writable data.  */
                    970: #define DATA_SECTION_ASM_OP "\n\tstatic   ; data_section\n"
                    971: 
                    972: /* How to refer to registers in assembler output.
                    973:    This sequence is indexed by compiler's hard-register-number (see above).  */
                    974: 
                    975: #define REGISTER_NAMES \
                    976:  { "0", "1", "2", "3", "4", "5", "6", "7", \
                    977:    "8", "9","10","11","12","13","14","15" }
                    978: 
                    979: /* How to renumber registers for dbx and gdb. */
                    980: 
                    981: #define DBX_REGISTER_NUMBER(REGNO) (REGNO)
                    982: 
                    983: /******************  Assembler output formatting  **********************/
                    984: 
                    985: #define ASM_IDENTIFY_GCC(FILE)  fputs ("; gcc2_compiled:\n", FILE)
                    986: 
                    987: #define ASM_COMMENT_START  ";"
                    988: 
                    989: #define ASM_OUTPUT_FUNNAM(FILE,NAME)   \
                    990:        fprintf(FILE,"%s\n",NAME)
                    991: 
                    992: #define ASM_OUTPUT_OPCODE(FILE,PTR)  do {              \
                    993:        while (*(PTR) != '\0' && *(PTR) != ' ') {       \
                    994:            putc (*(PTR), FILE);                        \
                    995:            (PTR)++;                                    \
                    996:          }                                             \
                    997:        while (*(PTR) == ' ')                           \
                    998:            (PTR)++;                                    \
                    999:        putc ('\t', FILE);                              \
                   1000:        program_counter += 2;                           \
                   1001:      } while (0)
                   1002: 
                   1003: #define ASM_DECLARE_FUNCTION_NAME(FILE,NAME,DECL)      \
                   1004:        fprintf(FILE,"%s\n",NAME)
                   1005: 
                   1006: /* This is how to output the definition of a user-level label named NAME,
                   1007:    such as the label on a static function or variable NAME.  */
                   1008: /* 1750 note: Labels are prefixed with a 'K'. This is because handling
                   1009:    has been changed for labels to be output in the "Constants" section
                   1010:    (named "Konst"), and special initialization code takes care of copying
                   1011:    the Const-section data into the writable data section (named "Static").
                   1012:    In the Static section we therefore have the true label names (i.e.
                   1013:    not prefixed with 'K').  */
                   1014: 
                   1015: #define ASM_OUTPUT_LABEL(FILE,NAME)    \
                   1016:   do {  if (NAME[0] == '.') {                                  \
                   1017:           fprintf(stderr,"Oops! label %s can't begin with '.'\n",NAME); \
                   1018:           abort();                                             \
                   1019:        }                                                       \
                   1020:        else {                                                  \
                   1021:           check_section(Konst);                                \
                   1022:           fprintf(FILE,"K%s\n",NAME);                          \
                   1023:           datalbl[++datalbl_ndx].name = (char *)strdup (NAME); \
                   1024:           label_pending = 1;                                   \
                   1025:        }                                                       \
                   1026:   } while (0)
                   1027: 
                   1028: 
                   1029: /* This is how to output a command to make the user-level label named NAME
                   1030:    defined for reference from other files.  */
                   1031: 
                   1032: #define ASM_GLOBALIZE_LABEL(FILE,NAME) do {            \
                   1033:           fprintf (FILE, "\tglobal  %s\t; export\n", NAME);    \
                   1034:   } while (0)
                   1035: 
                   1036: /* This is how to output a reference to a user-level label named NAME.
                   1037:    `assemble_name' uses this.  */
                   1038: 
                   1039: #define ASM_OUTPUT_LABELREF(FILE,NAME) \
                   1040:          fprintf (FILE, "%s", NAME)
                   1041: 
                   1042: /* This is how to output an internal numbered label where
                   1043:    PREFIX is the class of label and NUM is the number within the class.  */
                   1044: 
                   1045: #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM)             \
                   1046:        do {                                                    \
                   1047:          if (strcmp(PREFIX,"LC") == 0) {                       \
                   1048:             label_pending = 1;                                 \
                   1049:             datalbl[++datalbl_ndx].name = (char *) malloc (9); \
                   1050:             sprintf(datalbl[datalbl_ndx].name,"LC%d",NUM);     \
                   1051:             check_section(Konst);                              \
                   1052:             fprintf(FILE,"K%s%d\n",PREFIX,NUM);                \
                   1053:          }                                                     \
                   1054:          else if (find_jmplbl(NUM) < 0) {                      \
                   1055:             jmplbl[++jmplbl_ndx].num = NUM;                    \
                   1056:             jmplbl[jmplbl_ndx].pc = program_counter;           \
                   1057:             fprintf(FILE, "%s%d\n", PREFIX, NUM);              \
                   1058:          }                                                     \
                   1059:        } while (0)
                   1060: 
                   1061: 
                   1062: /* This is how to store into the string LABEL
                   1063:    the symbol_ref name of an internal numbered label where
                   1064:    PREFIX is the class of label and NUM is the number within the class.
                   1065:    This is suitable for output with `assemble_name'.  */
                   1066: 
                   1067: #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM)  \
                   1068:          sprintf (LABEL, "%s%d", PREFIX, NUM)
                   1069: 
                   1070: /* This is how to output an assembler line defining a 1750A `float'
                   1071:    constant.  */
                   1072: 
                   1073: #define ASM_OUTPUT_SHORT_FLOAT(FILE,VALUE)                     \
                   1074:   do {                                                         \
                   1075:       if (label_pending)                                       \
                   1076:         label_pending = 0;                                     \
                   1077:       else                                                     \
                   1078:          datalbl[++datalbl_ndx].name = float_label('D',VALUE); \
                   1079:       sprintf (datalbl[datalbl_ndx].value, "%lf", (double) VALUE); \
                   1080:       datalbl[datalbl_ndx].size = 2;                           \
                   1081:       fprintf (FILE, "\tdataf\t%lf\n",VALUE);                  \
                   1082:   } while(0)
                   1083: 
                   1084: /* This is how to output an assembler line defining a 1750A `double'
                   1085:     constant. */
                   1086: 
                   1087: #define ASM_OUTPUT_THREE_QUARTER_FLOAT(FILE,VALUE)             \
                   1088:   do {                                                         \
                   1089:       if (label_pending)                                       \
                   1090:         label_pending = 0;                                     \
                   1091:       else                                                     \
                   1092:          datalbl[++datalbl_ndx].name = float_label('E',VALUE); \
                   1093:       sprintf (datalbl[datalbl_ndx].value, "%lf", VALUE);      \
                   1094:       datalbl[datalbl_ndx].size = 3;                           \
                   1095:       fprintf(FILE,"\tdataef\t%lf\n",VALUE);                   \
                   1096:   } while (0)
                   1097: 
                   1098: /* This is how to output an assembler line defining a string constant.  */
                   1099: 
                   1100: #define ASM_OUTPUT_ASCII(FILE, PTR, LEN)  do {         \
                   1101:        int i;                                                          \
                   1102:        if (! label_pending)                                            \
                   1103:           fprintf(FILE,";in ASM_OUTPUT_ASCII without label_pending\n");\
                   1104:        else {                                                          \
                   1105:           label_pending = 0;                                           \
                   1106:           datalbl[datalbl_ndx].size = LEN;                             \
                   1107:        }                                                               \
                   1108:        for (i = 0; i < LEN; i++)                                       \
                   1109:          if (PTR[i] >= 32 && PTR[i] < 127)                             \
                   1110:            fprintf(FILE,"\tdata\t%d\t; '%c'\n",PTR[i],PTR[i]);         \
                   1111:          else                                                          \
                   1112:            fprintf(FILE,"\tdata\t%d\t; (ascii)\n",PTR[i]);             \
                   1113:   } while (0)
                   1114: 
                   1115: /* This is how to output an assembler line defining an `int' constant.  */
                   1116: 
                   1117: #define ASM_OUTPUT_INT(FILE,VALUE)  do {         \
                   1118:        if (! label_pending)                                            \
                   1119:           fprintf(FILE,";in ASM_OUTPUT_INT without label_pending\n");  \
                   1120:        else {                                                          \
                   1121:           label_pending = 0;                                           \
                   1122:           datalbl[datalbl_ndx].size = 1;                               \
                   1123:        }                                                               \
                   1124:        fprintf(FILE, "\tdata\t"); output_addr_const(FILE,VALUE);       \
                   1125:        fprintf(FILE, "\n"); } while (0)
                   1126: 
                   1127: /* This is how to output an assembler line defining a `long int' constant. */
                   1128: 
                   1129: #define ASM_OUTPUT_LONG_INT(FILE,VALUE) do {     \
                   1130:        if (! label_pending)                                            \
                   1131:           fprintf(FILE,";in ASM_OUTPUT_LONG_INT without label_pending\n");\
                   1132:        else {                                                          \
                   1133:           label_pending = 0;                                           \
                   1134:           datalbl[datalbl_ndx].size = 2;                               \
                   1135:        }                                                               \
                   1136:        fprintf(FILE, "\tdatal\t"); output_addr_const(FILE,VALUE);      \
                   1137:        fprintf(FILE, "\n"); } while (0)
                   1138: 
                   1139: /* Likewise for `short' and `char' constants.  */
                   1140: 
                   1141: #define ASM_OUTPUT_SHORT(FILE,VALUE)  ASM_OUTPUT_INT(FILE,VALUE)
                   1142: 
                   1143: /* For 1750, we treat char same as word. Tektronix 1750
                   1144:    Assembler does a better (packing) job with strings.  */
                   1145: #define ASM_OUTPUT_CHAR(FILE,VALUE)   ASM_OUTPUT_INT(FILE,VALUE)
                   1146: 
                   1147: /* This is how to output an assembler line for a numeric constant byte.  */
                   1148: /* 1750: For the time being, treating this same as word. Tektronix 1750
                   1149:    Assembler does a better (packing) job with strings.  */
                   1150: #define ASM_OUTPUT_BYTE(FILE,VALUE)  ASM_OUTPUT_INT(FILE,VALUE)
                   1151: 
                   1152: /* This is how to output an insn to push a register on the stack.
                   1153:    It need not be very fast code.  */
                   1154: 
                   1155: #define ASM_OUTPUT_REG_PUSH(FILE,REGNO)  \
                   1156:   fprintf (FILE, "\tPSHM R%s,R%s\n", reg_names[REGNO])
                   1157: 
                   1158: /* This is how to output an insn to pop a register from the stack.
                   1159:    It need not be very fast code.  */
                   1160: 
                   1161: #define ASM_OUTPUT_REG_POP(FILE,REGNO)  \
                   1162:        fprintf (FILE, "\tPOPM R%s,R%s\n", reg_names[REGNO])
                   1163: 
                   1164: /* This is how to output an element of a case-vector that is absolute. */
                   1165: 
                   1166: #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE)   \
                   1167:        fprintf (FILE, "\tdata\tL%d ;addr_vec_elt\n", VALUE)
                   1168: 
                   1169: /* This is how to output an element of a case-vector that is relative.  */
                   1170: 
                   1171: #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL)  \
                   1172:        fprintf (FILE, "\tdata\tL%d-L%d ;addr_diff_elt\n", VALUE,REL)
                   1173: 
                   1174: /* This is how to output an assembler line
                   1175:    that says to advance the location counter
                   1176:    to a multiple of 2**LOG bytes.  */
                   1177: 
                   1178: #define ASM_OUTPUT_ALIGN(FILE,LOG)     \
                   1179:  fprintf(FILE,"; in ASM_OUTPUT_ALIGN: pwr_of_2_bytcnt=%d\n",LOG)
                   1180: 
                   1181: #define ASM_OUTPUT_SKIP(FILE,SIZE)     \
                   1182:    fprintf(FILE,"; in ASM_OUTPUT_SKIP: size=%d\n",SIZE)
                   1183: 
                   1184: /* This says how to output an assembler line
                   1185:    to define a global common symbol.  */
                   1186: 
                   1187: #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED)  do {     \
                   1188:        fprintf (FILE, "\tcommon  %s,%d\n", NAME, SIZE);        \
                   1189:      } while (0)
                   1190: 
                   1191: #define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME)  do {            \
                   1192:        fprintf (FILE, "\tglobal  %s\t; import\n", NAME);       \
                   1193:      }  while (0)
                   1194: 
                   1195: /* This says how to output an assembler line
                   1196:    to define a local common symbol.  */
                   1197: 
                   1198: #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED)  do {  \
                   1199:        check_section (Static);                                 \
                   1200:        fprintf(FILE,"%s \tblock   %d\t; local common\n",NAME,SIZE);    \
                   1201:      } while (0)
                   1202: 
                   1203: /* Store in OUTPUT a string (made with alloca) containing
                   1204:    an assembler-name for a local static variable named NAME.
                   1205:    LABELNO is an integer which is different for each call.  */
                   1206: 
                   1207: #define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
                   1208: ( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10),   \
                   1209:   sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
                   1210: 
                   1211: #define ASM_OUTPUT_CONSTRUCTOR(FILE, NAME)  do {       \
                   1212:        fprintf(FILE, "\tinit\n\t"); assemble_name(NAME); \
                   1213:         fprintf(FILE,"  ;constructor"); } while (0)
                   1214: 
                   1215: #define ASM_OUTPUT_DESTRUCTOR(FILE, NAME)  do {        \
                   1216:        fprintf(FILE, "\tinit\n\t"); assemble_name(NAME); \
                   1217:         fprintf(FILE,"  ;destructor"); } while (0)
                   1218: 
                   1219: /* Define the parentheses used to group arithmetic operations
                   1220:    in assembler code.  */
                   1221: 
                   1222: #define ASM_OPEN_PAREN "("
                   1223: #define ASM_CLOSE_PAREN ")"
                   1224: 
                   1225: /* Define results of standard character escape sequences.  */
                   1226: #define TARGET_BELL    007
                   1227: #define TARGET_BS      010
                   1228: #define TARGET_TAB     011
                   1229: #define TARGET_NEWLINE 012
                   1230: #define TARGET_VT      013
                   1231: #define TARGET_FF      014
                   1232: #define TARGET_CR      015
                   1233: 
                   1234: 
                   1235: /* Print operand X (an rtx) in assembler syntax to file FILE.
                   1236:    CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
                   1237:    For `%' followed by punctuation, CODE is the punctuation and X is null.
                   1238:    1750 note:  there are three special CODE characters:
                   1239:         'D', 'E': print a reference to a floating point constant (D=double,
                   1240:                  E=single precision) label name
                   1241:        'F': print a label defining a floating-point constant value
                   1242:        'J': print the absolute value of a negative INT_CONST
                   1243:             (this is used in LISN/CISN/MISN/SISP and others)   */
                   1244: 
                   1245: /* 1750A: see file aux-output.c */
                   1246: #define PRINT_OPERAND(FILE, X, CODE)  print_operand(FILE,X,CODE)
                   1247: #define PRINT_OPERAND_ADDRESS(FILE, ADDR)  print_operand_address(FILE,ADDR)
                   1248: 

unix.superglobalmegacorp.com

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