Annotation of gcc/config/dsp16xx/dsp16xx.h, revision 1.1.1.2

1.1       root        1: /* Definitions of target machine for GNU compiler.  AT&T DSP1600.
1.1.1.2 ! root        2:    Copyright (C) 1994, 1995 Free Software Foundation, Inc.
1.1       root        3:    Contributed by Michael Collison ([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
1.1.1.2 ! root       19: the Free Software Foundation, 59 Temple Place - Suite 330,
        !            20: Boston, MA 02111-1307, USA.  */
1.1       root       21: 
                     22: extern char *low_reg_names[];
                     23: extern char *text_seg_name;
                     24: extern char *rsect_text;
                     25: extern char *data_seg_name;
                     26: extern char *rsect_data;
                     27: extern char *bss_seg_name;
                     28: extern char *rsect_bss;
                     29: extern char *const_seg_name;
                     30: extern char *rsect_const;
                     31: extern char *chip_name;
                     32: extern char *save_chip_name;
                     33: extern struct rtx_def *dsp16xx_compare_op0, *dsp16xx_compare_op1;
                     34: extern struct rtx_def *(*dsp16xx_compare_gen)();
                     35: extern struct rtx_def *gen_compare_reg();
                     36: extern struct rtx_def *dsp16xx_addhf3_libcall;
                     37: extern struct rtx_def *dsp16xx_subhf3_libcall;
                     38: extern struct rtx_def *dsp16xx_mulhf3_libcall;
                     39: extern struct rtx_def *dsp16xx_divhf3_libcall;
                     40: extern struct rtx_def *dsp16xx_cmphf3_libcall;
                     41: extern struct rtx_def *dsp16xx_fixhfhi2_libcall;
                     42: extern struct rtx_def *dsp16xx_floathihf2_libcall;
                     43: extern struct rtx_def *dsp16xx_neghf2_libcall;
                     44: extern struct rtx_def *dsp16xx_umulhi3_libcall;
                     45: extern struct rtx_def *dsp16xx_mulhi3_libcall;
                     46: extern struct rtx_def *dsp16xx_udivqi3_libcall;
                     47: extern struct rtx_def *dsp16xx_udivhi3_libcall;
                     48: extern struct rtx_def *dsp16xx_divqi3_libcall;
                     49: extern struct rtx_def *dsp16xx_divhi3_libcall;
                     50: extern struct rtx_def *dsp16xx_modqi3_libcall;
                     51: extern struct rtx_def *dsp16xx_modhi3_libcall;
                     52: extern struct rtx_def *dsp16xx_umodqi3_libcall;
                     53: extern struct rtx_def *dsp16xx_umodhi3_libcall;
                     54: 
                     55: extern struct rtx_def *dsp16xx_ashrhi3_libcall;
                     56: extern struct rtx_def *dsp16xx_ashlhi3_libcall;
                     57: extern struct rtx_def *dsp16xx_lshrhi3_libcall;
                     58: 
                     59: 
                     60: extern int hard_regno_mode_ok ();
                     61: extern enum reg_class dsp16xx_reg_class_from_letter ();
                     62: extern enum reg_class dsp16xx_limit_reload_class ();
                     63: extern int hard_regno_nregs ();
                     64: extern int regno_reg_class ();
                     65: extern int move_operand ();
                     66: extern int symbolic_address_p ();
                     67: extern int Y_address ();
                     68: extern int call_address_operand ();
                     69: extern void notice_update_cc();
                     70: extern void function_prologue ();
                     71: extern void function_epilogue ();
                     72: extern int  dsp1600_comparison_reverse ();
                     73: extern void double_reg_from_memory ();
                     74: extern void double_reg_to_memory ();
                     75: extern void bss_section ();
                     76: extern struct rtx_def *dsp16xx_function_arg ();
                     77: extern void dsp16xx_function_arg_advance ();
                     78: extern enum rtx_code next_cc_user_code ();
                     79: extern enum rtx_code save_next_cc_user_code;
                     80: extern struct rtx_def *gen_tst_reg ();
                     81: extern char *output_block_move();
                     82: 
                     83: /* RUN-TIME TARGET SPECIFICATION */
                     84: #define DSP16XX   1
                     85: 
                     86: /* Name of the AT&T assembler */
                     87: 
                     88: #define ASM_PROG "as1600"
                     89: 
                     90: /* Name of the AT&T linker */
                     91: 
                     92: #define LD_PROG "ld1600"
                     93: 
                     94: /* Define which switches take word arguments */
                     95: #define WORD_SWITCH_TAKES_ARG(STR)              \
                     96:   (!strcmp (STR, "ifile") ? 1 :                 \
                     97:    0)
                     98: 
                     99: #ifdef  CC1_SPEC
                    100: #undef  CC1_SPEC
                    101: #endif
                    102: #define CC1_SPEC       ""
                    103: 
                    104: /* Define this as a spec to call the AT&T assembler */
                    105: 
                    106: #define CROSS_ASM_SPEC   "%{!S:as1600 %a %i\n }"
                    107: 
                    108: /* Define this as a spec to call the AT&T linker */
                    109: 
                    110: #define CROSS_LINK_SPEC  "%{!c:%{!M:%{!MM:%{!E:%{!S:ld1600 %l %X %{o*} %{m} \
                    111:                        %{r} %{s} %{t} %{u*} %{x}\
1.1.1.2 ! root      112:                        %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:}\
        !           113:                        %{L*} %D %o %{!nostdlib:-le1600 %L -le1600}\
        !           114:                        %{!A:%{!nostdlib:%{!nostartfiles:%E}}}\n }}}}}"
1.1       root      115: 
                    116: /* Nothing complicated here, just link with libc.a under normal
                    117:    circumstances */
                    118: #define LIB_SPEC "-lc"
                    119: 
                    120: /* Specify the startup file to link with. */
                    121: #define STARTFILE_SPEC "%{mmap1:m1_crt0.o%s}  \
                    122: %{mmap2:m2_crt0.o%s}                          \
                    123: %{mmap3:m3_crt0.o%s}                          \
                    124: %{mmap4:m4_crt0.o%s}                          \
                    125: %{!mmap*: %{!ifile*: m4_crt0.o%s} %{ifile*:     \
                    126: %eA -ifile option requires a -map option}}"
                    127: 
                    128: /* Specify the end file to link with */
                    129: 
                    130: #define ENDFILE_SPEC "%{mmap1:m1_crtn.o%s}  \
                    131: %{mmap2:m2_crtn.o%s}                          \
                    132: %{mmap3:m3_crtn.o%s}                          \
                    133: %{mmap4:m4_crtn.o%s}                          \
                    134: %{!mmap*: %{!ifile*: m4_crtn.o%s} %{ifile*:     \
                    135: %eA -ifile option requires a -map option}}"
                    136: 
                    137: 
                    138: /* Tell gcc where to look for the startfile */
                    139: #define STANDARD_STARTFILE_PREFIX   "/d1600/lib"
                    140: 
                    141: /* Tell gcc where to look for it's executables */
                    142: #define STANDARD_EXEC_PREFIX  "/d1600/bin"
                    143: 
                    144: /* Command line options to the AT&T assembler */
                    145: #define ASM_SPEC  "%{V} %{v:%{!V:-V}} %{g*:-g}"
                    146: 
                    147: /* Command line options for the AT&T linker */
                    148: #define LINK_SPEC "%{V} %{v:%{!V:-V}} %{minit:-i}  \
                    149: %{!ifile*:%{mmap1:-ifile m1_deflt.if%s}         \
                    150:           %{mmap2:-ifile m2_deflt.if%s}         \
                    151:           %{mmap3:-ifile m3_deflt.if%s}         \
                    152:           %{mmap4:-ifile m4_deflt.if%s}         \
                    153:           %{!mmap*:-ifile m4_deflt.if%s}}       \
                    154: %{ifile*} %{!r:-a}"
                    155: 
                    156: /* Names to predefine in the preprocessor for this target machine.  */
                    157: #ifdef __MSDOS__
                    158: #define CPP_PREDEFINES "-Ddsp1600 -DDSP1600 -DMSDOS"
                    159: #else
                    160: #define CPP_PREDEFINES "-Ddsp1600 -DDSP1600 -Ddsp1610 -DDSP1610"
                    161: #endif
                    162: 
                    163: /* Run-time compilation parameters selecting different hardware subsets.  */
                    164: 
                    165: extern int target_flags;
                    166: 
                    167: /* Macros used in the machine description to test the flags.  */
                    168: 
                    169: #define MASK_REGPARM         0x00000001    /* Pass parameters in registers */
                    170: #define MASK_NEAR_CALL       0x00000002    /* The call is on the same 4k page */
                    171: #define MASK_NEAR_JUMP       0x00000004    /* The jump is on the same 4k page */
                    172: #define MASK_BMU             0x00000008    /* Use the 'bmu' shift instructions */
                    173: #define MASK_OPTIMIZE_MEMORY 0x00000010    /* Optimize to conserve memory */
                    174: #define MASK_OPTIMIZE_SPEED  0x00000020    /* Optimize for speed */
                    175: #define MASK_MAP1            0x00000040    /* Link with map1 */
                    176: #define MASK_MAP2            0x00000080    /* Link with map2 */
                    177: #define MASK_MAP3            0x00000100    /* Link with map3 */
                    178: #define MASK_MAP4            0x00000200    /* Link with map4 */
                    179: #define MASK_YBASE_HIGH      0x00000400    /* The ybase register window starts high */
                    180: #define MASK_INIT           0x00000800    /* Have the linker generate tables to
                    181:                                              initialize data at startup */
                    182: #define MASK_INLINE_MULT     0x00001000    /* Inline 32 bit multiplies */
                    183: #define MASK_RESERVE_YBASE   0x00002000    /* Reserved the ybase registers */
                    184: 
                    185: /* Compile passing first two args in regs 0 and 1.
                    186:    This exists only to test compiler features that will
                    187:    be needed for RISC chips.  It is not usable
                    188:    and is not intended to be usable on this cpu.  */
                    189: #define TARGET_REGPARM   (target_flags & MASK_REGPARM)
                    190: 
                    191: /* The call is on the same 4k page, so instead of loading
                    192:    the 'pt' register and branching, we can branch directly */
                    193: 
                    194: #define TARGET_NEAR_CALL (target_flags & MASK_NEAR_CALL)
                    195: 
                    196: /* The jump is on the same 4k page, so instead of loading
                    197:    the 'pt' register and branching, we can branch directly */
                    198: 
                    199: #define TARGET_NEAR_JUMP (target_flags & MASK_NEAR_JUMP)
                    200: 
                    201: /* Generate shift instructions to use the 1610 Bit Manipulation
                    202:    Unit. */
                    203: #define TARGET_BMU (target_flags & MASK_BMU)
                    204: 
1.1.1.2 ! root      205: /* Optimize to conserve memory */
1.1       root      206: #define TARGET_OPTIMIZE_MEMORY (target_flags & MASK_OPTIMIZE_MEMORY)
                    207: 
                    208: /* Optimize for maximum speed */
                    209: #define TARGET_OPTIMIZE_SPEED   (target_flags & MASK_OPTIMIZE_SPEED)
                    210: 
                    211: #define TARGET_YBASE_HIGH (target_flags & MASK_YBASE_HIGH)
                    212: 
                    213: /* Direct the linker to output extra info for initialized data */
                    214: #define TARGET_MASK_INIT (target_flags & MASK_INIT)
                    215: 
                    216: #define TARGET_INLINE_MULT (target_flags & MASK_INLINE_MULT)
                    217: 
                    218: /* Reserve the ybase registers *(0) - *(31) */
                    219: #define TARGET_RESERVE_YBASE (target_flags & MASK_RESERVE_YBASE)
                    220: 
                    221: /* Macro to define tables used to set the flags.
                    222:    This is a list in braces of pairs in braces,
                    223:    each pair being { "NAME", VALUE }
                    224:    where VALUE is the bits to set or minus the bits to clear.
                    225:    An empty string NAME is used to identify the default VALUE.  */
                    226: 
                    227: 
                    228: #define TARGET_SWITCHES                        \
                    229:   {                                           \
                    230:     { "regparm",       MASK_REGPARM},         \
                    231:     { "no-regparm",   -MASK_REGPARM},         \
                    232:     { "no-near-call", -MASK_NEAR_CALL},        \
                    233:     { "near-jump",     MASK_NEAR_JUMP},        \
                    234:     { "no-near-jump", -MASK_NEAR_JUMP},        \
                    235:     { "bmu",           MASK_BMU},              \
                    236:     { "no-bmu",       -MASK_BMU},              \
                    237:     { "Om",            MASK_OPTIMIZE_MEMORY},  \
                    238:     { "Os",            MASK_OPTIMIZE_SPEED},   \
                    239:     { "map1",          MASK_MAP1},             \
                    240:     { "map2",          MASK_MAP2},             \
                    241:     { "map3",          MASK_MAP3},             \
                    242:     { "map4",          MASK_MAP4},             \
                    243:     { "ybase-high",    MASK_YBASE_HIGH},       \
                    244:     { "init",          MASK_INIT},             \
                    245:     { "inline-mult",   MASK_INLINE_MULT},      \
                    246:     { "reserve-ybase", MASK_RESERVE_YBASE},    \
                    247:     { "",              TARGET_DEFAULT}         \
                    248:   }
                    249: 
                    250: /* Default target_flags if no switches are specified */
                    251: #ifndef TARGET_DEFAULT
                    252: #define TARGET_DEFAULT  MASK_OPTIMIZE_MEMORY|MASK_REGPARM|MASK_YBASE_HIGH
                    253: #endif
                    254: 
                    255: /* This macro is similar to `TARGET_SWITCHES' but defines names of
                    256:    command options that have values.  Its definition is an
                    257:    initializer with a subgrouping for each command option.
                    258: 
                    259:    Each subgrouping contains a string constant, that defines the
                    260:    fixed part of the option name, and the address of a variable. 
                    261:    The variable, type `char *', is set to the variable part of the
                    262:    given option if the fixed part matches.  The actual option name
                    263:    is made by appending `-m' to the specified name.
                    264: 
                    265:    Here is an example which defines `-mshort-data-NUMBER'.  If the
                    266:    given option is `-mshort-data-512', the variable `m88k_short_data'
                    267:    will be set to the string `"512"'.
                    268: 
                    269:        extern char *m88k_short_data;
                    270:        #define TARGET_OPTIONS { { "short-data-", &m88k_short_data } }  */
                    271: 
                    272: #define TARGET_OPTIONS                                         \
                    273: {                                                              \
                    274:   { "text=",   &text_seg_name  },                              \
                    275:   { "data=",   &data_seg_name  },                              \
                    276:   { "bss=",    &bss_seg_name   },                              \
                    277:   { "const=",   &const_seg_name },                              \
                    278:   { "chip=",    &chip_name      }                               \
                    279: }
                    280: 
                    281: /* Sometimes certain combinations of command options do not make sense
                    282:    on a particular target machine.  You can define a macro
                    283:    `OVERRIDE_OPTIONS' to take account of this.  This macro, if
                    284:    defined, is executed once just after all the command options have
                    285:    been parsed. */
                    286: 
                    287: #define OVERRIDE_OPTIONS override_options ()
                    288: 
                    289: #define OPTIMIZATION_OPTIONS(LEVEL)                   \
                    290: {                                                     \
                    291:     flag_gnu_linker             = FALSE;              \
                    292:                                                       \
                    293:     if (LEVEL)                                        \
                    294:     {                                                 \
                    295:        flag_omit_frame_pointer = TRUE;               \
                    296:        flag_thread_jumps       = TRUE;               \
                    297:     }                                                 \
                    298:                                                       \
                    299:     if (LEVEL >= 2)                                   \
                    300:     {                                                 \
                    301:        flag_strength_reduce         = TRUE;          \
                    302:        flag_cse_follow_jumps        = TRUE;          \
                    303:        flag_cse_skip_blocks         = TRUE;          \
                    304:        flag_expensive_optimizations = TRUE;          \
                    305:        flag_rerun_cse_after_loop    = TRUE;          \
                    306:     }                                                 \
                    307:                                                       \
                    308:     if (LEVEL >= 3)                                   \
                    309:     {                                                 \
                    310:        flag_inline_functions = 1;                     \
                    311:     }                                                 \
                    312: }
                    313: 
                    314: /* STORAGE LAYOUT */
                    315: 
                    316: /* Define if you don't want extended real, but do want to use the
                    317:    software floating point emulator for REAL_ARITHMETIC and
                    318:    decimal <-> binary conversion. */
                    319: #define REAL_ARITHMETIC
                    320: 
                    321: /* Define this if most significant bit is lowest numbered
                    322:    in instructions that operate on numbered bit-fields.
                    323:  */
                    324: #define BITS_BIG_ENDIAN  1
                    325: 
                    326: /* Define this if most significant byte of a word is the lowest numbered.
                    327:    We define big-endian, but since the 1600 series cannot address bytes
                    328:    it does not matter. */
                    329: #define BYTES_BIG_ENDIAN 1
                    330: 
                    331: /* Define this if most significant word of a multiword number is numbered.
                    332:    For the 1600 we can decide arbitrarily since there are no machine instructions for them. */
                    333: #define WORDS_BIG_ENDIAN 1
                    334: 
1.1.1.2 ! root      335: /* number of bits in an addressable storage unit */
1.1       root      336: #define BITS_PER_UNIT 16
                    337: 
                    338: /* Width in bits of a "word", which is the contents of a machine register.
                    339:    Note that this is not necessarily the width of data type `int';
                    340:    if using 16-bit ints on a 68000, this would still be 32.
                    341:    But on a machine with 16-bit registers, this would be 16.  */
                    342: #define BITS_PER_WORD 16
                    343: 
                    344: /* Maximum number of bits in a word. */
                    345: #define MAX_BITS_PER_WORD 16
                    346: 
                    347: /* Width of a word, in units (bytes).  */
                    348: #define UNITS_PER_WORD 1
                    349: 
                    350: /* Width in bits of a pointer.
                    351:    See also the macro `Pmode' defined below.  */
                    352: #define POINTER_SIZE 16
                    353: 
                    354: /* Allocation boundary (in *bits*) for storing pointers in memory.  */
                    355: #define POINTER_BOUNDARY 16
                    356: 
                    357: /* Allocation boundary (in *bits*) for storing arguments in argument list.  */
                    358: #define PARM_BOUNDARY 16
                    359: 
                    360: /* Boundary (in *bits*) on which stack pointer should be aligned.  */
                    361: #define STACK_BOUNDARY 16
                    362: 
                    363: /* Allocation boundary (in *bits*) for the code of a function.  */
                    364: #define FUNCTION_BOUNDARY 16
                    365: 
                    366: /* Biggest alignment that any data type can require on this machine, in bits.  */
                    367: #define BIGGEST_ALIGNMENT 16
                    368: 
                    369: /* Biggest alignment that any structure field can require on this machine, in bits */
                    370: #define BIGGEST_FIELD_ALIGNMENT 16
                    371: 
                    372: /* Alignment of field after `int : 0' in a structure.  */
                    373: #define EMPTY_FIELD_BOUNDARY 16
                    374: 
                    375: /* Number of bits which any structure or union's size must be a multiple of. Each structure
                    376:    or union's size is rounded up to a multiple of this */
                    377: #define STRUCTURE_SIZE_BOUNDARY 16
                    378: 
                    379: /* Define this if move instructions will actually fail to work
                    380:    when given unaligned data.  */
                    381: #define STRICT_ALIGNMENT  1
                    382: 
                    383: /* An integer expression for the size in bits of the largest integer machine mode that
                    384:    should actually be used. All integer machine modes of this size or smaller can be
                    385:    used for structures and unions with the appropriate sizes. */
                    386: #define MAX_FIXED_MODE_SIZE 32
                    387: 
                    388: /* LAYOUT OF SOURCE LANGUAGE DATA TYPES */
                    389: 
                    390: #define CHAR_TYPE_SIZE         16
                    391: #define SHORT_TYPE_SIZE        16
                    392: #define INT_TYPE_SIZE          16
                    393: #define LONG_TYPE_SIZE         32
                    394: #define LONG_LONG_TYPE_SIZE    32
                    395: #define FLOAT_TYPE_SIZE        32
                    396: #define DOUBLE_TYPE_SIZE       32
                    397: #define LONG_DOUBLE_TYPE_SIZE  32
                    398: 
                    399: /* An expression whose value is 1 or 0, according to whether the type char should be
                    400:    signed or unsigned by default. */
                    401: 
                    402: #define DEFAULT_SIGNED_CHAR 1
                    403: 
                    404: /* A C expression to determine whether to give an enum type only as many bytes
                    405:    as it takes to represent the range of possible values of that type. A nonzero
                    406:    value means to do that; a zero value means all enum types should be allocated
                    407:    like int. */
                    408: 
                    409: #define DEFAULT_SHORT_ENUMS 0
                    410: 
                    411: /* A C expression for a string describing the name of the data type to use for
                    412:    size values. */
                    413: 
                    414: #define SIZE_TYPE    "long unsigned int"
                    415: 
                    416: /* A C expression for a string describing the name of the datat type to use for the
                    417:    result of subtracting two pointers */
                    418: 
                    419: #define PTRDIFF_TYPE "long int"
                    420: 
                    421: #define TARGET_BELL     '\a'
                    422: #define TARGET_BS       '\b'
                    423: #define TARGET_TAB      '\t'
                    424: #define TARGET_NEWLINE  '\n'
                    425: #define TARGET_VT       '\v'
                    426: #define TARGET_FF       '\f'
                    427: #define TARGET_CR       '\r'
                    428: 
                    429: 
                    430: /* REGISTER USAGE.  */
                    431: 
                    432: #define ALL_16_BIT_REGISTERS  1
                    433: 
                    434: /* Number of actual hardware registers.
                    435:    The hardware registers are assigned numbers for the compiler
                    436:    from 0 to FIRST_PSEUDO_REGISTER-1 */
                    437: 
                    438: #define FIRST_PSEUDO_REGISTER REG_YBASE31 + 1
                    439: 
                    440: /* 1 for registers that have pervasive standard uses
                    441:    and are not available for the register allocator.
                    442: 
                    443:    The registers are layed out as follows:
                    444: 
                    445:    {a0,a0l,a1,a1l,x,y,yl,p,pl} - Data Arithmetic Unit
                    446:    {r0,r1,r2,r3,j,k,ybase} - Y Space Address Arithmetic Unit
                    447:    {pt} - X Space Address Arithmetic Unit
                    448:    {ar0,ar1,ar2,ar3} - Bit Manipulation UNit
                    449:    {pr} - Return Address Register
                    450: 
                    451:    We reserve r2 for the Stack Pointer.
                    452:    We specify r3 for the Frame Pointer but allow the compiler
                    453:    to omit it when possible since we have so few pointer registers. */
                    454: 
                    455: #define REG_A0     0
                    456: #define REG_A0L    1
                    457: #define REG_A1     2
                    458: #define REG_A1L    3 
                    459: #define REG_X      4
                    460: #define REG_Y      5
                    461: #define REG_YL     6
                    462: #define REG_PROD   7
                    463: #define REG_PRODL  8
                    464: #define REG_R0     9
                    465: #define REG_R1     10
                    466: #define REG_R2     11
                    467: #define REG_R3     12
                    468: #define REG_J      13
                    469: #define REG_K      14
                    470: #define REG_YBASE  15
                    471: #define REG_PT     16
                    472: #define REG_AR0    17
                    473: #define REG_AR1    18
                    474: #define REG_AR2    19
                    475: #define REG_AR3    20
                    476: #define REG_C0     21
                    477: #define REG_C1     22
                    478: #define REG_C2     23
                    479: #define REG_PR     24
                    480: #define REG_RB     25
                    481: #define REG_YBASE0 26
                    482: #define REG_YBASE1 27
                    483: #define REG_YBASE2 28
                    484: #define REG_YBASE3 29
                    485: #define REG_YBASE4 30
                    486: #define REG_YBASE5 31
                    487: #define REG_YBASE6 32
                    488: #define REG_YBASE7 33
                    489: #define REG_YBASE8 34
                    490: #define REG_YBASE9 35
                    491: #define REG_YBASE10 36
                    492: #define REG_YBASE11 37
                    493: #define REG_YBASE12 38
                    494: #define REG_YBASE13 39
                    495: #define REG_YBASE14 40
                    496: #define REG_YBASE15 41
                    497: #define REG_YBASE16 42
                    498: #define REG_YBASE17 43
                    499: #define REG_YBASE18 44
                    500: #define REG_YBASE19 45
                    501: #define REG_YBASE20 46
                    502: #define REG_YBASE21 47
                    503: #define REG_YBASE22 48
                    504: #define REG_YBASE23 49
                    505: #define REG_YBASE24 50
                    506: #define REG_YBASE25 51
                    507: #define REG_YBASE26 52
                    508: #define REG_YBASE27 53
                    509: #define REG_YBASE28 54
                    510: #define REG_YBASE29 55
                    511: #define REG_YBASE30 56
                    512: #define REG_YBASE31 57
                    513: 
                    514: /* Do we have a accumulator register? */
                    515: #define IS_ACCUM_REG(REGNO) ((REGNO) >= REG_A0 && (REGNO) <= REG_A1L)
                    516: #define IS_ACCUM_LOW_REG(REGNO) ((REGNO) == REG_A0L || (REGNO) == REG_A1L)
                    517: 
                    518: /* Do we have a virtual ybase register */
                    519: #define IS_YBASE_REGISTER_WINDOW(REGNO) ((REGNO) >= REG_YBASE0 && (REGNO) <= REG_YBASE31)
                    520: 
                    521: #define IS_ADDRESS_REGISTER(REGNO) ((REGNO) >= REG_R0 && (REGNO) <= REG_R3)
                    522: 
                    523: #define FIXED_REGISTERS     \
                    524: {0, 0, 0, 0, 0, 0, 0, 0, 0, \
                    525:  0, 0, 0, 1, 0, 0, 1,       \
                    526:  1,                         \
                    527:  0, 0, 0, 0,                \
                    528:  1, 1, 1,                   \
                    529:  0, 0,                      \
                    530:  0, 0, 0, 0, 0, 0, 0, 0,    \
                    531:  0, 0, 0, 0, 0, 0, 0, 0,    \
                    532:  0, 0, 0, 0, 0, 0, 0, 0,    \
                    533:  0, 0, 0, 0, 0, 0, 0, 0}
                    534: 
                    535: /* 1 for registers not available across function calls.
                    536:    These must include the FIXED_REGISTERS and also any
                    537:    registers that can be used without being saved.
                    538:    The latter must include the registers where values are returned
                    539:    and the register where structure-value addresses are passed.
                    540:    On the 1610 'a0' holds return values from functions. 'r0' holds
                    541:    structure-value addresses.
                    542: 
                    543:    In addition we don't save either j, k, ybase or any of the
                    544:    bit manipulation registers.  */
                    545: 
                    546: 
                    547: #define CALL_USED_REGISTERS   \
                    548: {1, 1, 1, 1, 0, 1, 1, 1, 1,   \
                    549:  1, 0, 0, 1, 1, 1, 1,         \
                    550:  1,                           \
                    551:  0, 0, 1, 1,                  \
                    552:  1, 1, 1,                     \
                    553:  0, 1,                        \
                    554:  0, 0, 0, 0, 0, 0, 0, 0,      \
                    555:  0, 0, 0, 0, 0, 0, 0, 0,      \
                    556:  0, 0, 0, 0, 0, 0, 0, 0,      \
                    557:  0, 0, 0, 0, 0, 0, 0, 0}
                    558: 
                    559: /* List the order in which to allocate registers.  Each register must be
                    560:    listed once, even those in FIXED_REGISTERS.
                    561: 
                    562:    We allocate in the following order:
                    563:  */
                    564: 
                    565: #define REG_ALLOC_ORDER                                        \
                    566: { REG_R0, REG_R1, REG_R2, REG_PROD, REG_Y, REG_X,       \
                    567:   REG_PRODL, REG_YL, REG_AR0, REG_AR1,                  \
                    568:   REG_RB, REG_A0, REG_A1, REG_A0L,                      \
                    569:   REG_A1L, REG_AR2, REG_AR3,                            \
                    570:   REG_YBASE, REG_J, REG_K, REG_PR, REG_PT, REG_C0,      \
                    571:   REG_C1, REG_C2, REG_R3,                              \
                    572:   REG_YBASE0, REG_YBASE1, REG_YBASE2, REG_YBASE3,       \
                    573:   REG_YBASE4, REG_YBASE5, REG_YBASE6, REG_YBASE7,       \
                    574:   REG_YBASE8, REG_YBASE9, REG_YBASE10, REG_YBASE11,     \
                    575:   REG_YBASE12, REG_YBASE13, REG_YBASE14, REG_YBASE15,   \
                    576:   REG_YBASE16, REG_YBASE17, REG_YBASE18, REG_YBASE19,   \
                    577:   REG_YBASE20, REG_YBASE21, REG_YBASE22, REG_YBASE23,   \
                    578:   REG_YBASE24, REG_YBASE25, REG_YBASE26, REG_YBASE27,   \
                    579:   REG_YBASE28, REG_YBASE29, REG_YBASE30, REG_YBASE31 }
                    580: 
                    581: /* Zero or more C statements that may conditionally modify two
                    582:    variables `fixed_regs' and `call_used_regs' (both of type `char
                    583:    []') after they have been initialized from the two preceding
                    584:    macros.
                    585: 
                    586:    This is necessary in case the fixed or call-clobbered registers
                    587:    depend on target flags.
                    588: 
                    589:    You need not define this macro if it has no work to do.
                    590: 
                    591:    If the usage of an entire class of registers depends on the target
                    592:    flags, you may indicate this to GCC by using this macro to modify
                    593:    `fixed_regs' and `call_used_regs' to 1 for each of the registers in
                    594:    the classes which should not be used by GCC.  Also define the macro
                    595:    `REG_CLASS_FROM_LETTER' to return `NO_REGS' if it is called with a
                    596:    letter for a class that shouldn't be used.
                    597: 
                    598:    (However, if this class is not included in `GENERAL_REGS' and all
                    599:    of the insn patterns whose constraints permit this class are
                    600:    controlled by target switches, then GCC will automatically avoid
                    601:    using these registers when the target switches are opposed to
                    602:    them.)  If the user tells us there is no BMU, we can't use
1.1.1.2 ! root      603:    ar0-ar3 for register allocation */
1.1       root      604: 
                    605: #define CONDITIONAL_REGISTER_USAGE                                     \
                    606: do                                                                     \
                    607:   {                                                                    \
                    608:     if (!TARGET_BMU)                                                   \
                    609:       {                                                                        \
                    610:        int regno;                                                      \
                    611:                                                                        \
                    612:        for (regno = REG_AR0; regno <= REG_AR3; regno++)                \
                    613:          fixed_regs[regno] = call_used_regs[regno] = 1;                \
                    614:       }                                                                        \
                    615:     if (TARGET_RESERVE_YBASE)                                          \
                    616:       {                                                                        \
                    617:        int regno;                                                      \
                    618:                                                                        \
                    619:        for (regno = REG_YBASE0; regno <= REG_YBASE31; regno++)         \
                    620:          fixed_regs[regno] = call_used_regs[regno] = 1;                \
                    621:       }                                                                        \
                    622:   }                                                                    \
                    623: while (0)
                    624: 
                    625: /* Determine which register classes are very likely used by spill registers.
                    626:    local-alloc.c won't allocate pseudos that have these classes as their
                    627:    preferred class unless they are "preferred or nothing".  */
                    628: 
                    629: #define CLASS_LIKELY_SPILLED_P(CLASS) \
                    630:  ((CLASS) != ALL_REGS && (CLASS) != YBASE_VIRT_REGS)
                    631: 
                    632: /* Return number of consecutive hard regs needed starting at reg REGNO
                    633:    to hold something of mode MODE.
                    634:    This is ordinarily the length in words of a value of mode MODE
                    635:    but can be less for certain modes in special long registers. */
                    636: 
                    637: #define HARD_REGNO_NREGS(REGNO, MODE)                                 \
                    638:   (GET_MODE_SIZE(MODE))
                    639: 
                    640: /* Value is 1 if hard register REGNO can hold a value of machine-mode MODE. */
                    641: 
                    642: #define HARD_REGNO_MODE_OK(REGNO, MODE) hard_regno_mode_ok(REGNO, MODE)
                    643: 
                    644: /* Value is 1 if it is a good idea to tie two pseudo registers
                    645:    when one has mode MODE1 and one has mode MODE2.
                    646:    If HARD_REGNO_MODE_OK could produce different values for MODE1 and MODE2,
                    647:    for any hard reg, then this must be 0 for correct output.  */
                    648: #define MODES_TIEABLE_P(MODE1, MODE2)               \
                    649:   (((MODE1) == (MODE2)) ||                           \
                    650:    (GET_MODE_CLASS((MODE1)) == MODE_FLOAT)           \
                    651:     == (GET_MODE_CLASS((MODE2)) == MODE_FLOAT))
                    652: 
                    653: /* Specify the registers used for certain standard purposes.
                    654:    The values of these macros are register numbers.  */
                    655: 
                    656: /* DSP1600 pc isn't overloaded on a register.  */
                    657: /* #define PC_REGNUM  */
                    658: 
                    659: /* Register to use for pushing function arguments.  
                    660:    This is r3 in our case */
                    661: #define STACK_POINTER_REGNUM  REG_R3
                    662: 
                    663: /* Base register for access to local variables of the function.
                    664:    This is r2 in our case   */
                    665: #define FRAME_POINTER_REGNUM  REG_R2
                    666: 
                    667: /* We can debug without the frame pointer */
                    668: #define CAN_DEBUG_WITHOUT_FP 1
                    669: 
                    670: /* The 1610 saves the return address in this register */
                    671: #define RETURN_ADDRESS_REGNUM REG_PR
                    672: 
                    673: /* Base register for access to arguments of the function.  */
                    674: #define ARG_POINTER_REGNUM FRAME_POINTER_REGNUM
                    675: 
                    676: /* Register in which static-chain is passed to a function.  */
                    677: 
                    678: #define STATIC_CHAIN_REGNUM 4
                    679: 
                    680: /* Register in which address to store a structure value
                    681:    is passed to a function.  This is 'r0' in our case */
                    682: #define STRUCT_VALUE_REGNUM   REG_R0
                    683: 
                    684: /* Define the classes of registers for register constraints in the
                    685:    machine description.  Also define ranges of constants.
                    686: 
                    687:    One of the classes must always be named ALL_REGS and include all hard regs.
                    688:    If there is more than one class, another class must be named NO_REGS
                    689:    and contain no registers.
                    690: 
                    691:    The name GENERAL_REGS must be the name of a class (or an alias for
                    692:    another name such as ALL_REGS).  This is the class of registers
                    693:    that is allowed by "g" or "r" in a register constraint.
                    694:    Also, registers outside this class are allocated only when
                    695:    instructions express preferences for them.
                    696: 
                    697:    The classes must be numbered in nondecreasing order; that is,
                    698:    a larger-numbered class must never be contained completely
                    699:    in a smaller-numbered class.
                    700: 
                    701:    For any two classes, it is very desirable that there be another
                    702:    class that represents their union.  */
                    703: 
                    704: 
                    705: enum reg_class 
                    706: { 
                    707:     NO_REGS, 
                    708:     A0H_REG,
                    709:     A0L_REG,
                    710:     A0_REG,
                    711:     A1H_REG,
                    712:     ACCUM_HIGH_REGS,
                    713:     A1L_REG,
                    714:     ACCUM_LOW_REGS, 
                    715:     A1_REG,
                    716:     ACCUM_REGS, 
                    717:     X_REG, 
                    718:     X_OR_ACCUM_LOW_REGS,
                    719:     X_OR_ACCUM_REGS,
                    720:     YH_REG,
                    721:     YH_OR_ACCUM_HIGH_REGS,
                    722:     X_OR_YH_REGS,
                    723:     YL_REG,
                    724:     YL_OR_ACCUM_LOW_REGS,
                    725:     X_OR_YL_REGS,
                    726:     X_OR_Y_REGS,
                    727:     Y_REG,
                    728:     ACCUM_OR_Y_REGS,
                    729:     PH_REG,
                    730:     X_OR_PH_REGS, 
                    731:     PL_REG, 
                    732:     PL_OR_ACCUM_LOW_REGS,
                    733:     X_OR_PL_REGS,
                    734:     YL_OR_PL_OR_ACCUM_LOW_REGS,
                    735:     P_REG,
                    736:     ACCUM_OR_P_REGS,
                    737:     YL_OR_P_REGS,
                    738:     ACCUM_LOW_OR_YL_OR_P_REGS,
                    739:     Y_OR_P_REGS,
                    740:     ACCUM_Y_OR_P_REGS, 
                    741:     NO_FRAME_Y_ADDR_REGS,
                    742:     Y_ADDR_REGS, 
                    743:     ACCUM_LOW_OR_Y_ADDR_REGS,
                    744:     ACCUM_OR_Y_ADDR_REGS,
                    745:     X_OR_Y_ADDR_REGS,
                    746:     Y_OR_Y_ADDR_REGS,
                    747:     P_OR_Y_ADDR_REGS,
                    748:     NON_HIGH_YBASE_ELIGIBLE_REGS,
                    749:     YBASE_ELIGIBLE_REGS,
                    750:     J_REG,
                    751:     J_OR_DAU_16_BIT_REGS,
                    752:     BMU_REGS, 
                    753:     NOHIGH_NON_ADDR_REGS,
                    754:     NON_ADDR_REGS,
                    755:     SLOW_MEM_LOAD_REGS,
                    756:     NOHIGH_NON_YBASE_REGS,
                    757:     NO_ACCUM_NON_YBASE_REGS,
                    758:     NON_YBASE_REGS,
                    759:     YBASE_VIRT_REGS,
                    760:     ACCUM_LOW_OR_YBASE_REGS,
                    761:     ACCUM_OR_YBASE_REGS,
                    762:     X_OR_YBASE_REGS,
                    763:     Y_OR_YBASE_REGS,
                    764:     ACCUM_LOW_YL_PL_OR_YBASE_REGS,
                    765:     P_OR_YBASE_REGS,
                    766:     ACCUM_Y_P_OR_YBASE_REGS,
                    767:     Y_ADDR_OR_YBASE_REGS,
                    768:     YBASE_OR_NOHIGH_YBASE_ELIGIBLE_REGS,
                    769:     YBASE_OR_YBASE_ELIGIBLE_REGS,
                    770:     NO_HIGH_ALL_REGS,
                    771:     ALL_REGS, 
                    772:     LIM_REG_CLASSES 
                    773: };
                    774: 
                    775: /* GENERAL_REGS must be the name of a register class */
                    776: #define GENERAL_REGS ALL_REGS
                    777: 
                    778: #define N_REG_CLASSES (int) LIM_REG_CLASSES
                    779: 
                    780: /* Give names of register classes as strings for dump file.   */
                    781: 
                    782: #define REG_CLASS_NAMES        \
                    783: {                              \
                    784:     "NO_REGS",                 \
                    785:     "A0H_REG",                 \
                    786:     "A0L_REG",                 \
                    787:     "A0_REG",                  \
                    788:     "A1H_REG",                 \
                    789:     "ACCUM_HIGH_REGS",         \
                    790:     "A1L_REG",                 \
                    791:     "ACCUM_LOW_REGS",          \
                    792:     "A1_REG",                  \
                    793:     "ACCUM_REGS",              \
                    794:     "X_REG",                   \
                    795:     "X_OR_ACCUM_LOW_REGS",     \
                    796:     "X_OR_ACCUM_REGS",         \
                    797:     "YH_REG",                  \
                    798:     "YH_OR_ACCUM_HIGH_REGS",   \
                    799:     "X_OR_YH_REGS",            \
                    800:     "YL_REG",                  \
                    801:     "YL_OR_ACCUM_LOW_REGS",    \
                    802:     "X_OR_YL_REGS",            \
                    803:     "X_OR_Y_REGS",             \
                    804:     "Y_REG",                   \
                    805:     "ACCUM_OR_Y_REGS",         \
                    806:     "PH_REG",                  \
                    807:     "X_OR_PH_REGS",            \
                    808:     "PL_REG",                  \
                    809:     "PL_OR_ACCUM_LOW_REGS",    \
                    810:     "X_OR_PL_REGS",            \
                    811:     "PL_OR_YL_OR_ACCUM_LOW_REGS", \
                    812:     "P_REG",                   \
                    813:     "ACCUM_OR_P_REGS",         \
                    814:     "YL_OR_P_REGS",            \
                    815:     "ACCUM_LOW_OR_YL_OR_P_REGS", \
                    816:     "Y_OR_P_REGS",             \
                    817:     "ACCUM_Y_OR_P_REGS",       \
                    818:     "NO_FRAME_Y_ADDR_REGS",      \
                    819:     "Y_ADDR_REGS",               \
                    820:     "ACCUM_LOW_OR_Y_ADDR_REGS",  \
                    821:     "ACCUM_OR_Y_ADDR_REGS",    \
                    822:     "X_OR_Y_ADDR_REGS",        \
                    823:     "Y_OR_Y_ADDR_REGS",        \
                    824:     "P_OR_Y_ADDR_REGS",        \
                    825:     "NON_HIGH_YBASE_ELIGIBLE_REGS", \
                    826:     "YBASE_ELIGIBLE_REGS",     \
                    827:     "J_REG",                   \
                    828:     "J_OR_DAU_16_BIT_REGS",    \
                    829:     "BMU_REGS",                \
                    830:     "NOHIGH_NON_ADDR_REGS",    \
                    831:     "NON_ADDR_REGS",           \
                    832:     "SLOW_MEM_LOAD_REGS",      \
                    833:     "NOHIGH_NON_YBASE_REGS",   \
                    834:     "NO_ACCUM_NON_YBASE_REGS", \
                    835:     "NON_YBASE_REGS",          \
                    836:     "YBASE_VIRT_REGS",         \
                    837:     "ACCUM_LOW_OR_YBASE_REGS", \
                    838:     "ACCUM_OR_YBASE_REGS",     \
                    839:     "X_OR_YBASE_REGS",         \
                    840:     "Y_OR_YBASE_REGS",         \
                    841:     "ACCUM_LOW_YL_PL_OR_YBASE_REGS", \
                    842:     "P_OR_YBASE_REGS",         \
                    843:     "ACCUM_Y_P_OR_YBASE_REGS", \
                    844:     "Y_ADDR_OR_YBASE_REGS",    \
                    845:     "YBASE_OR_NOHIGH_YBASE_ELIGIBLE_REGS", \
                    846:     "YBASE_OR_YBASE_ELIGIBLE_REGS", \
                    847:     "NO_HIGH_ALL_REGS",        \
                    848:     "ALL_REGS"                 \
                    849: }
                    850: 
                    851: /* Define which registers fit in which classes.
                    852:    This is an initializer for a vector of HARD_REG_SET
                    853:    of length N_REG_CLASSES.  */
                    854: 
                    855: #define REG_CLASS_CONTENTS   \
                    856: {                            \
                    857:     {0x00000000,  0x00000000},      /* no reg */                             \
                    858:     {0x00000001,  0x00000000},      /* a0h */                                \
                    859:     {0x00000002,  0x00000000},      /* a0l */                                \
                    860:     {0x00000003,  0x00000000},      /* a0h:a0l */                            \
                    861:     {0x00000004,  0x00000000},      /* a1h */                                \
                    862:     {0x00000005,  0x00000000},      /* accum high */                         \
                    863:     {0x00000008,  0x00000000},      /* a1l */                                \
                    864:     {0x0000000A,  0x00000000},      /* accum low */                          \
                    865:     {0x0000000c,  0x00000000},      /* a1h:a1l */                            \
                    866:     {0x0000000f,  0x00000000},      /* accum regs */                         \
                    867:     {0x00000010,  0x00000000},      /* x reg */                              \
                    868:     {0x0000001A,  0x00000000},      /* x & accum_low_regs */                 \
                    869:     {0x0000001f,  0x00000000},      /* x & accum regs */                     \
                    870:     {0x00000020,  0x00000000},      /* y high */                             \
                    871:     {0x00000025,  0x00000000},      /* yh, accum high */                     \
                    872:     {0x00000030,  0x00000000},      /* x & yh */                             \
                    873:     {0x00000040,  0x00000000},      /* y low */                              \
                    874:     {0x0000004A,  0x00000000},      /* y low, accum_low */                   \
                    875:     {0x00000050,  0x00000000},      /* x & yl */                             \
                    876:     {0x00000060,  0x00000000},      /* yl:yh */                              \
                    877:     {0x00000070,  0x00000000},      /* x, yh,a nd yl */                      \
                    878:     {0x0000006F,  0x00000000},      /* accum, y */                           \
                    879:     {0x00000080,  0x00000000},      /* p high */                             \
                    880:     {0x00000090,  0x00000000},      /* x & ph */                             \
                    881:     {0x00000100,  0x00000000},      /* p low */                              \
                    882:     {0x0000010A,  0x00000000},      /* p_low and accum_low */                \
                    883:     {0x00000110,  0x00000000},      /* x & pl */                             \
                    884:     {0x0000014A,  0x00000000},      /* pl,yl,a1l,a0l */                      \
                    885:     {0x00000180,  0x00000000},      /* pl:ph */                              \
                    886:     {0x0000018F,  0x00000000},      /* accum, p */                           \
                    887:     {0x000001C0,  0x00000000},      /* pl:ph and yl */                       \
                    888:     {0x000001CA,  0x00000000},      /* pl:ph, yl, a0l, a1l */                \
                    889:     {0x000001E0,  0x00000000},      /* y or p */                             \
                    890:     {0x000001EF,  0x00000000},      /* accum, y or p */                      \
                    891:     {0x00000E00,  0x00000000},      /* r0-r2 */                              \
                    892:     {0x00001E00,  0x00000000},      /* r0-r3 */                              \
                    893:     {0x00001E0A,  0x00000000},      /* r0-r3, accum_low */                   \
                    894:     {0x00001E0F,  0x00000000},      /* accum,r0-r3 */                        \
                    895:     {0x00001E10,  0x00000000},      /* x,r0-r3 */                            \
                    896:     {0x00001E60,  0x00000000},      /* y,r0-r3 */                            \
                    897:     {0x00001F80,  0x00000000},      /* p,r0-r3 */                            \
                    898:     {0x00001FDA,  0x00000000},      /* ph:pl, r0-r3, x,a0l,a1l */            \
                    899:     {0x00001fff,  0x00000000},      /* accum,x,y,p,r0-r3 */                  \
                    900:     {0x00002000,  0x00000000},      /* j */                                  \
                    901:     {0x00002025,  0x00000000},      /* j, yh, a1h, a0h */                    \
                    902:     {0x001E0000,  0x00000000},      /* ar0-ar3 */                            \
                    903:     {0x03FFE1DA,  0x00000000},      /* non_addr except yh,a0h,a1h */         \
                    904:     {0x03FFE1FF,  0x00000000},      /* non_addr regs */                      \
                    905:     {0x03FFFF8F,  0x00000000},      /* non ybase except yh, yl, and x */     \
                    906:     {0x03FFFFDA,  0x00000000},      /* non ybase regs except yh,a0h,a1h */   \
                    907:     {0x03FFFFF0,  0x00000000},      /* non ybase except a0,a0l,a1,a1l */     \
                    908:     {0x03FFFFFF,  0x00000000},      /* non ybase regs */                     \
                    909:     {0xFC000000,  0x03FFFFFF},      /* virt ybase regs */                    \
                    910:     {0xFC00000A,  0x03FFFFFF},      /* accum_low, virt ybase regs */         \
                    911:     {0xFC00000F,  0x03FFFFFF},      /* accum, virt ybase regs */             \
                    912:     {0xFC000010,  0x03FFFFFF},      /* x,virt ybase regs */                  \
                    913:     {0xFC000060,  0x03FFFFFF},      /* y,virt ybase regs */                  \
                    914:     {0xFC00014A,  0x03FFFFFF},      /* accum_low, yl, pl, ybase */           \
                    915:     {0xFC000180,  0x03FFFFFF},      /* p,virt ybase regs */                  \
                    916:     {0xFC0001EF,  0x03FFFFFF},      /* accum,y,p,ybase regs */               \
                    917:     {0xFC001E00,  0x03FFFFFF},      /* r0-r3, ybase regs */                  \
                    918:     {0xFC001FDA,  0x03FFFFFF},      /* r0-r3, pl:ph,yl,x,a1l,a0l */          \
                    919:     {0xFC001FFF,  0x03FFFFFF},      /* virt ybase, ybase eligible regs */    \
                    920:     {0xFCFFFFDA,  0x03FFFFFF},      /* all regs except yh,a0h,a1h */         \
                    921:     {0xFFFFFFFF,  0x03FFFFFF}       /* all regs */                           \
                    922: }
                    923: 
                    924: 
                    925: /* The same information, inverted:
                    926:    Return the class number of the smallest class containing
                    927:    reg number REGNO.  This could be a conditional expression
                    928:    or could index an array.  */
                    929: 
                    930: #define REGNO_REG_CLASS(REGNO) regno_reg_class(REGNO)
                    931: 
                    932: /* The class value for index registers, and the one for base regs.  */
                    933: 
                    934: #define INDEX_REG_CLASS NO_REGS
                    935: #define BASE_REG_CLASS  Y_ADDR_REGS
                    936: 
                    937: /* Get reg_class from a letter such as appears in the machine description. */
                    938: 
                    939: #define REG_CLASS_FROM_LETTER(C) \
                    940:   dsp16xx_reg_class_from_letter(C)
                    941: 
                    942: #define SECONDARY_RELOAD_CLASS(CLASS, MODE, X)  \
                    943:    secondary_reload_class(CLASS, MODE, X)
                    944: 
                    945: /* When defined, the compiler allows registers explicitly used in the
                    946:    rtl to be used as spill registers but prevents the compiler from
                    947:    extending the lifetime of these registers. */
                    948: 
                    949: #define SMALL_REGISTER_CLASSES
                    950: 
                    951: /* Macros to check register numbers against specific register classes.  */
                    952: 
                    953: /* These assume that REGNO is a hard or pseudo reg number.
                    954:    They give nonzero only if REGNO is a hard reg of the suitable class
                    955:    or a pseudo reg currently allocated to a suitable hard reg.
                    956:    Since they use reg_renumber, they are safe only once reg_renumber
                    957:    has been allocated, which happens in local-alloc.c.  */
                    958: 
                    959: /* A C expression which is nonzero if register REGNO is suitable for use
                    960:    as a base register in operand addresses. It may be either a suitable
                    961:    hard register or a pseudo register that has been allocated such a
                    962:    hard register. 
                    963: 
                    964:   On the 1610 the Y address pointers can be used as a base registers */
                    965: #define REGNO_OK_FOR_BASE_P(REGNO) \
                    966: (((REGNO) >= REG_R0 && (REGNO) < REG_R3 + 1) || ((unsigned) reg_renumber[REGNO] >= REG_R0  \
                    967:                                    && (unsigned) reg_renumber[REGNO] < REG_R3 + 1))
                    968: 
                    969: #define REGNO_OK_FOR_YBASE_P(REGNO) \
                    970:   (((REGNO) == REG_YBASE) || ((unsigned) reg_renumber[REGNO] == REG_YBASE))
                    971: 
                    972: #define REGNO_OK_FOR_INDEX_P(REGNO)  0
                    973: 
                    974: #ifdef ALL_16_BIT_REGISTERS
                    975: #define IS_32_BIT_REG(REGNO)  0
                    976: #else
                    977: #define IS_32_BIT_REG(REGNO)     \
                    978:   ((REGNO) == REG_A0 || (REGNO) == REG_A1 || (REGNO) == REG_Y || (REGNO) == REG_PROD)
                    979: #endif
                    980: 
                    981: /* Given an rtx X being reloaded into a reg required to be
                    982:    in class CLASS, return the class of reg to actually use.
                    983:    In general this is just CLASS; but on some machines
                    984:    in some cases it is preferable to use a more restrictive class.
                    985:    Also, we must ensure that a PLUS is reloaded either
                    986:    into an accumulator or an address register.  */
                    987: 
                    988: #define PREFERRED_RELOAD_CLASS(X,CLASS)         preferred_reload_class (X, CLASS)
                    989: 
                    990: /*   A C expression that places additional restrictions on the register
                    991:      class to use when it is necessary to be able to hold a value of
                    992:      mode MODE in a reload register for which class CLASS would
                    993:      ordinarily be used.
                    994: 
                    995:      Unlike `PREFERRED_RELOAD_CLASS', this macro should be used when
                    996:      there are certain modes that simply can't go in certain reload
                    997:      classes.
                    998: 
                    999:      The value is a register class; perhaps CLASS, or perhaps another,
                   1000:      smaller class.
                   1001: 
                   1002:      Don't define this macro unless the target machine has limitations
                   1003:      which require the macro to do something nontrivial. */
                   1004: 
                   1005: #if 0
                   1006: #define LIMIT_RELOAD_CLASS(MODE, CLASS) dsp16xx_limit_reload_class (MODE, CLASS)
                   1007: #endif
                   1008: 
                   1009: /* A C expression for the maximum number of consecutive registers of class CLASS
1.1.1.2 ! root     1010:    needed to hold a value of mode MODE */
1.1       root     1011: #define CLASS_MAX_NREGS(CLASS, MODE)                                \
                   1012:     class_max_nregs(CLASS, MODE)
                   1013: 
                   1014: /* The letters 'I' through 'P' in a register constraint string
                   1015:    can be used to stand for particular ranges of immediate operands.
                   1016:    This macro defines what the ranges are.
                   1017:    C is the letter, and VALUE is a constant value.
                   1018:    Return 1 if VALUE is in the range specified by C.
                   1019: 
                   1020:    For the 16xx, the following constraints are used:
                   1021:    'I' requires a non-negative 16-bit value.
                   1022:    'J' requires a non-negative 9-bit value
                   1023:    'K' requires a constant 0 operand.
                   1024:    'L' requires 16-bit value
                   1025:    'M' 32-bit value -- low 16-bits zero
                   1026:  */
                   1027: 
                   1028: #define SMALL_INT(X) (SMALL_INTVAL (INTVAL (X)))
                   1029: #define SMALL_INTVAL(I) ((unsigned) (I) < 0x10000)
                   1030: #define SHORT_IMMEDIATE(X)  (SHORT_INTVAL (INTVAL(X)))
                   1031: #define SHORT_INTVAL(I)     ((unsigned) (I) < 0x100)
                   1032: 
                   1033: #define CONST_OK_FOR_LETTER_P(VALUE, C)                           \
                   1034:    ((C) == 'I' ? (SMALL_INTVAL(VALUE))                            \
                   1035:     : (C) == 'J' ? (SHORT_INTVAL(VALUE))                          \
                   1036:     : (C) == 'K' ? ((VALUE) == 0)                                 \
                   1037:     : (C) == 'L' ? ! ((VALUE) & ~0x0000ffff)                     \
                   1038:     : (C) == 'M' ? ! ((VALUE) & ~0xffff0000)                     \
                   1039:     : (C) == 'N' ? ((VALUE) == -1 || (VALUE) == 1 ||              \
                   1040:                     (VALUE) == -2 || (VALUE) == 2)                \
                   1041:     : 0)
                   1042: 
                   1043: #define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C)   1
                   1044: 
                   1045: /* Optional extra constraints for this machine */
                   1046: #define EXTRA_CONSTRAINT(OP,C)                                    \
                   1047:   ((C) == 'R' ? symbolic_address_p (OP)                           \
                   1048:    : 0)
                   1049: 
                   1050: /* DESCRIBING STACK LAYOUT AND CALLING CONVENTIONS */
                   1051: 
                   1052: /* Define this if pushing a word on the stack
                   1053:    makes the stack pointer a smaller address.  */
                   1054: /* #define STACK_GROWS_DOWNWARD */
                   1055: 
                   1056: /* Define this if the nominal address of the stack frame
                   1057:    is at the high-address end of the local variables;
                   1058:    that is, each additional local variable allocated
                   1059:    goes at a more negative offset in the frame.  */
                   1060: /* #define FRAME_GROWS_DOWNWARD */
                   1061: 
                   1062: #define ARGS_GROW_DOWNWARD
                   1063: 
                   1064: /* We use post decrement on the 1600 because there isn't
                   1065:    a pre-decrement addressing mode. This means that we
                   1066:    assume the stack pointer always points at the next
                   1067:    FREE location on the stack. */
                   1068: #define STACK_PUSH_CODE POST_INC
                   1069: 
                   1070: /* Offset within stack frame to start allocating local variables at.
                   1071:    If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
                   1072:    first local allocated.  Otherwise, it is the offset to the BEGINNING
                   1073:    of the first local allocated.  */
                   1074: #define STARTING_FRAME_OFFSET  0
                   1075: 
                   1076: /* Offset from the stack pointer register to the first
                   1077:    location at which outgoing arguments are placed. */
                   1078: #define STACK_POINTER_OFFSET (0)
                   1079: 
                   1080: struct dsp16xx_frame_info
                   1081: {
                   1082:   unsigned long total_size;    /* # bytes that the entire frame takes up */
                   1083:   unsigned long var_size;      /* # bytes that variables take up */
                   1084:   unsigned long args_size;     /* # bytes that outgoing arguments take up */
                   1085:   unsigned long extra_size;    /* # bytes of extra gunk */
                   1086:   unsigned int  reg_size;      /* # bytes needed to store regs */
                   1087:   long         fp_save_offset; /* offset from vfp to store registers */
                   1088:   unsigned long sp_save_offset;        /* offset from new sp to store registers */
                   1089:   int          initialized;    /* != 0 if frame size already calculated */
                   1090:   int          num_regs;       /* number of registers saved */
                   1091:   int           function_makes_calls;  /* Does the function make calls */
                   1092: };
                   1093: 
                   1094: extern struct dsp16xx_frame_info current_frame_info;
                   1095: 
                   1096: /* If we generate an insn to push BYTES bytes,
                   1097:    this says how many the stack pointer really advances by. */
                   1098: /* #define PUSH_ROUNDING(BYTES) ((BYTES)) */
                   1099: 
                   1100: /* If defined, the maximum amount of space required for outgoing
                   1101:    arguments will be computed and placed into the variable
                   1102:    'current_function_outgoing_args_size'. No space will be pushed
                   1103:    onto the stack for each call; instead, the function prologue should
                   1104:    increase the stack frame size by this amount.
                   1105: 
                   1106:    It is not proper to define both 'PUSH_ROUNDING' and
                   1107:    'ACCUMULATE_OUTGOING_ARGS'. */
                   1108: #define ACCUMULATE_OUTGOING_ARGS
                   1109: 
                   1110: /* Offset of first parameter from the argument pointer
                   1111:    register value. */
                   1112: 
                   1113: #define FIRST_PARM_OFFSET(FNDECL)   (0)
                   1114: 
                   1115: /* Value is 1 if returning from a function call automatically
                   1116:    pops the arguments described by the number-of-args field in the call.
1.1.1.2 ! root     1117:    FUNDECL is the declaration node of the function (as a tree),
1.1       root     1118:    FUNTYPE is the data type of the function (as a tree),
                   1119:    or for a library call it is an identifier node for the subroutine name. */
                   1120: 
1.1.1.2 ! root     1121: #define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0
1.1       root     1122: 
                   1123: /* Define how to find the value returned by a function.
                   1124:    VALTYPE is the data type of the value (as a tree).
                   1125:    If the precise function being called is known, FUNC is its FUNCTION_DECL;
                   1126:    otherwise, FUNC is 0. On the 1610 all function return their values
                   1127:    in a0 (i.e. the upper 16 bits). If the return value is 32-bits the
                   1128:    entire register is significant. */
                   1129: 
                   1130: #define VALUE_REGNO(MODE)  (REG_Y)
                   1131: 
                   1132: #define FUNCTION_VALUE(VALTYPE, FUNC)  \
                   1133:   gen_rtx (REG, TYPE_MODE (VALTYPE), VALUE_REGNO(TYPE_MODE(VALTYPE)))
                   1134: 
                   1135: /* Define how to find the value returned by a library function
                   1136:    assuming the value has mode MODE.  */
                   1137: #define LIBCALL_VALUE(MODE)  gen_rtx (REG, MODE, VALUE_REGNO(MODE))
                   1138: 
                   1139: /* 1 if N is a possible register number for a function value. */
                   1140: #define FUNCTION_VALUE_REGNO_P(N) ((N) == REG_Y)
                   1141: 
                   1142: 
                   1143: /* Define where to put the arguments to a function.
                   1144:    Value is zero to push the argument on the stack,
                   1145:    or a hard register in which to store the argument.
                   1146: 
                   1147:    MODE is the argument's machine mode.
                   1148:    TYPE is the data type of the argument (as a tree).
                   1149:     This is null for libcalls where that information may
                   1150:     not be available.
                   1151:    CUM is a variable of type CUMULATIVE_ARGS which gives info about
                   1152:     the preceding args and about the function being called.
                   1153:    NAMED is nonzero if this argument is a named parameter
                   1154:     (otherwise it is an extra parameter matching an ellipsis).  */
                   1155: 
                   1156: /* On the 1610 all args are pushed, except if -mregparm is specified
                   1157:    then the first two words of arguments are passed in a0, a1. */
                   1158: #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
                   1159:   dsp16xx_function_arg (CUM, MODE, TYPE, NAMED)
                   1160: 
                   1161: /* Define the first register to be used for argument passing */
                   1162: #define FIRST_REG_FOR_FUNCTION_ARG REG_Y
                   1163: 
1.1.1.2 ! root     1164: /* Define the profitability of saving registers around calls.
        !          1165:    NOTE: For now we turn this off because of a bug in the
1.1       root     1166:    caller-saves code and also because i'm not sure it is helpful
                   1167:    on the 1610. */
                   1168: 
                   1169: #define CALLER_SAVE_PROFITABLE(REFS,CALLS) 0
                   1170: 
                   1171: /* This indicates that an argument is to be passed with an invisible reference
                   1172:    (i.e., a pointer to the object is passed).
                   1173: 
                   1174:    On the dsp16xx, we do this if it must be passed on the stack.  */
                   1175: 
                   1176: #define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) \
                   1177:   (MUST_PASS_IN_STACK (MODE, TYPE))
                   1178: 
                   1179: /* For an arg passed partly in registers and partly in memory,
                   1180:    this is the number of registers used.
                   1181:    For args passed entirely in registers or entirely in memory, zero.  */
                   1182: 
                   1183: #define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED)  (0)
                   1184: 
                   1185: /* Define a data type for recording info about an argument list
                   1186:    during the scan of that argument list.  This data type should
                   1187:    hold all necessary information about the function itself
                   1188:    and about the args processed so far, enough to enable macros
                   1189:    such as FUNCTION_ARG to determine where the next arg should go. */
                   1190: #define CUMULATIVE_ARGS int
                   1191: 
                   1192: /* Initialize a variable CUM of type CUMULATIVE_ARGS
                   1193:    for a call to a function whose data type is FNTYPE.
                   1194:    For a library call, FNTYPE is 0. */
                   1195: #define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME)  ((CUM) = 0)
                   1196: 
                   1197: /* Update the data in CUM to advance over an argument
                   1198:    of mode MODE and data type TYPE.
                   1199:    (TYPE is null for libcalls where that information may not be available.)  */
                   1200: 
                   1201: #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED)   \
                   1202:   dsp16xx_function_arg_advance (&CUM, MODE,TYPE, NAMED)
                   1203: 
                   1204: /* 1 if N is a possible register number for function argument passing. */
                   1205: #define FUNCTION_ARG_REGNO_P(N)   \
                   1206:   ((N) == REG_Y || (N) == REG_YL || (N) == REG_PROD || (N) == REG_PRODL)
                   1207: 
                   1208: /* This macro generates the assembly code for function entry.
                   1209:    FILE is a stdio stream to output the code to.
                   1210:    SIZE is an int: how many units of temporary storage to allocate.
                   1211:    Refer to the array `regs_ever_live' to determine which registers
                   1212:    to save; `regs_ever_live[I]' is nonzero if register number I
                   1213:    is ever used in the function.  This macro is responsible for
                   1214:    knowing which registers should not be saved even if used. */
                   1215: 
                   1216: #define FUNCTION_PROLOGUE(FILE, SIZE)     function_prologue(FILE, SIZE)
                   1217: 
                   1218: /* Output assembler code to FILE to increment profiler label # LABELNO
                   1219:    for profiling a function entry. */
                   1220: 
                   1221: #define FUNCTION_PROFILER(FILE, LABELNO)        fatal("Profiling not implemented yet.")
                   1222: 
                   1223: /* Output assembler code to FILE to initialize this source file's
                   1224:    basic block profiling info, if that has not already been done. */
                   1225: #define FUNCTION_BLOCK_PROFILER(FILE, LABELNO)  fatal("Profiling not implemented yet.")
                   1226: 
                   1227: /* Output assembler code to FILE to increment the entry-count for
                   1228:    the BLOCKNO'th basic block in this source file. */
                   1229: #define BLOCK_PROFILER(FILE, BLOCKNO)          fatal("Profiling not implemented yet.")
                   1230: 
                   1231: 
                   1232: /* EXIT_IGNORE_STACK should be nonzero if, when returning from a function,
                   1233:    the stack pointer does not matter.  The value is tested only in
                   1234:    functions that have frame pointers.
                   1235:    No definition is equivalent to always zero.  */
                   1236: 
                   1237: #define EXIT_IGNORE_STACK  (0)
                   1238: 
                   1239: #define TRAMPOLINE_TEMPLATE(FILE) fatal ("Trampolines not yet implemented");
                   1240: 
                   1241: /* Length in units of the trampoline for entering a nested function.
                   1242:    This is a dummy value  */
                   1243: 
                   1244: #define TRAMPOLINE_SIZE 20
                   1245: 
                   1246: /* Emit RTL insns to initialize the variable parts of a trampoline.
                   1247:    FNADDR is an RTX for the address of the function's pure code.
                   1248:    CXT is an RTX for the static chain value for the function. */
                   1249: 
                   1250: #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT)                      \
                   1251:   fatal ("Trampolines not yet implemented");
                   1252: 
                   1253: /* This macro generates the assembly code for function exit,
                   1254:    on machines that need it.  If FUNCTION_EPILOGUE is not defined
                   1255:    then individual return instructions are generated for each
                   1256:    return statement.  Args are same as for FUNCTION_PROLOGUE.
                   1257: 
                   1258:    The function epilogue should not depend on the current stack pointer!
                   1259:    It should use the frame pointer only.  This is mandatory because
                   1260:    of alloca; we also take advantage of it to omit stack adjustments
                   1261:    before returning. */
                   1262: 
                   1263: #define FUNCTION_EPILOGUE(FILE, SIZE)   function_epilogue(FILE, SIZE)
                   1264: 
                   1265: /* A C expression which is nonzero if a function must have and use a
                   1266:    frame pointer. If its value is nonzero the functions will have a
                   1267:    frame pointer. */
                   1268: #define FRAME_POINTER_REQUIRED  (current_function_calls_alloca)
                   1269: 
                   1270: /* A C statement to store in the variable 'DEPTH' the difference
                   1271:    between the frame pointer and the stack pointer values immediately
                   1272:    after the function prologue. */
                   1273: #define INITIAL_FRAME_POINTER_OFFSET(DEPTH)                     \
                   1274: {  (DEPTH) = initial_frame_pointer_offset();                   \
                   1275: }
                   1276: 
                   1277: /* IMPLICIT CALLS TO LIBRARY ROUTINES */
                   1278: 
                   1279: #define ADDHF3_LIBCALL      "__Emulate_addhf3"
                   1280: #define SUBHF3_LIBCALL      "__Emulate_subhf3"
                   1281: #define MULHF3_LIBCALL      "__Emulate_mulhf3"
                   1282: #define DIVHF3_LIBCALL      "__Emulate_divhf3"
                   1283: #define CMPHF3_LIBCALL      "__Emulate_cmphf3"
                   1284: #define FIXHFHI2_LIBCALL    "__Emulate_fixhfhi2"
                   1285: #define FLOATHIHF2_LIBCALL  "__Emulate_floathihf2"
                   1286: #define NEGHF2_LIBCALL      "__Emulate_neghf2"
                   1287: 
                   1288: #define UMULHI3_LIBCALL     "__Emulate_umulhi3"
                   1289: #define MULHI3_LIBCALL      "__Emulate_mulhi3"
                   1290: #define UDIVQI3_LIBCALL     "__Emulate_udivqi3"
                   1291: #define UDIVHI3_LIBCALL     "__Emulate_udivhi3"
                   1292: #define DIVQI3_LIBCALL      "__Emulate_divqi3"
                   1293: #define DIVHI3_LIBCALL      "__Emulate_divhi3"
                   1294: #define MODQI3_LIBCALL      "__Emulate_modqi3"
                   1295: #define MODHI3_LIBCALL      "__Emulate_modhi3"
                   1296: #define UMODQI3_LIBCALL     "__Emulate_umodqi3"
                   1297: #define UMODHI3_LIBCALL     "__Emulate_umodhi3"
                   1298: #define ASHRHI3_LIBCALL     "__Emulate_ashrhi3"
                   1299: #define LSHRHI3_LIBCALL     "__Emulate_lshrhi3"
                   1300: #define ASHLHI3_LIBCALL     "__Emulate_ashlhi3"
                   1301: #define LSHLHI3_LIBCALL     "__Emulate_lshlhi3"   /* NOT USED */
                   1302: 
                   1303: /* Define this macro if calls to the ANSI C library functions memcpy and
                   1304:    memset should be generated instead of the BSD function bcopy & bzero. */
                   1305: #define TARGET_MEM_FUNCTIONS
                   1306: 
                   1307: 
                   1308: /* ADDRESSING MODES */
                   1309: 
                   1310: /* The 1610 has post-increment and decrement, but no pre-modify */
                   1311: #define HAVE_POST_INCREMENT
                   1312: #define HAVE_POST_DECREMENT
                   1313: 
                   1314: /* #define HAVE_PRE_DECREMENT */
                   1315: /* #define HAVE_PRE_INCREMENT */
                   1316: 
                   1317: /* Recognize any constant value that is a valid address.  */
                   1318: #define CONSTANT_ADDRESS_P(X)  CONSTANT_P (X)
                   1319: 
                   1320: /* Maximum number of registers that can appear in a valid memory address.  */
                   1321: #define MAX_REGS_PER_ADDRESS 1
                   1322: 
                   1323: /* The macros REG_OK_FOR..._P assume that the arg is a REG rtx
                   1324:    and check its validity for a certain class.
                   1325:    We have two alternate definitions for each of them.
                   1326:    The usual definition accepts all pseudo regs; the other rejects
                   1327:    them unless they have been allocated suitable hard regs.
                   1328:    The symbol REG_OK_STRICT causes the latter definition to be used.
                   1329: 
                   1330:    Most source files want to accept pseudo regs in the hope that
                   1331:    they will get allocated to the class that the insn wants them to be in.
                   1332:    Source files for reload pass need to be strict.
                   1333:    After reload, it makes no difference, since pseudo regs have
                   1334:    been eliminated by then.  */
                   1335: 
                   1336: #ifndef REG_OK_STRICT
                   1337: 
                   1338: /* Nonzero if X is a hard reg that can be used as an index
                   1339:    or if it is a pseudo reg.  */
                   1340: #define REG_OK_FOR_INDEX_P(X)  0
                   1341: 
                   1342: /* Nonzero if X is a hard reg that can be used as a base reg
                   1343:    or if it is a pseudo reg.  */
                   1344: #define REG_OK_FOR_BASE_P(X)    \
                   1345:     ((REGNO (X) >= REG_R0 && REGNO (X) < REG_R3 + 1 )          \
                   1346:        || (REGNO (X) >= FIRST_PSEUDO_REGISTER))
                   1347: 
                   1348: /* Nonzero if X is the 'ybase' register */
                   1349: #define REG_OK_FOR_YBASE_P(X)   \
                   1350:   (REGNO(X) == REG_YBASE || (REGNO (X) >= FIRST_PSEUDO_REGISTER))
                   1351: #else
                   1352: 
                   1353: /* Nonzero if X is a hard reg that can be used as an index.  */
                   1354: #define REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P (REGNO (X))
                   1355: 
                   1356: /* Nonzero if X is a hard reg that can be used as a base reg.  */
                   1357: #define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X))
                   1358: 
                   1359: /* Nonzero if X is the 'ybase' register */
                   1360: #define REG_OK_FOR_YBASE_P(X) REGNO_OK_FOR_YBASE_P (REGNO(X))
                   1361: 
                   1362: #endif
                   1363: 
                   1364: /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
                   1365:    that is a valid memory address for an instruction.
                   1366:    The MODE argument is the machine mode for the MEM expression
                   1367:    that wants to use this address.
                   1368: 
                   1369:    On the 1610, the actual legitimate addresses must be N (N must fit in
                   1370:    5 bits), *rn (register indirect), *rn++, or *rn-- */
                   1371: 
                   1372: #define INT_FITS_5_BITS(I)    ((unsigned long) (I) < 0x20)
                   1373: #define INT_FITS_16_BITS(I)   ((unsigned long) (I) < 0x10000)
                   1374: #define YBASE_CONST_OFFSET(I)       ((I) >= -31 && (I) <= 0)
                   1375: #define YBASE_OFFSET(X)       (GET_CODE (X) == CONST_INT && YBASE_CONST_OFFSET (INTVAL(X)))
                   1376: 
                   1377: #define FITS_16_BITS(X)       (GET_CODE (X) == CONST_INT && INT_FITS_16_BITS(INTVAL(X)))
                   1378: #define FITS_5_BITS(X)        (GET_CODE (X) == CONST_INT && INT_FITS_5_BITS(INTVAL(X)))
                   1379: #define ILLEGAL_HIMODE_ADDR(MODE, CONST)  ((MODE) == HImode && CONST == -31)
                   1380: 
                   1381: #define INDIRECTABLE_ADDRESS_P(X)                            \
                   1382:     ((GET_CODE(X) == REG && REG_OK_FOR_BASE_P(X))            \
                   1383:   || ((GET_CODE(X) == POST_DEC || GET_CODE(X) == POST_INC)   \
                   1384:        && REG_P(XEXP(X,0)) && REG_OK_FOR_BASE_P(XEXP(X,0)))  \
                   1385:   || (GET_CODE(X) == CONST_INT && (unsigned long) (X) < 0x20))
                   1386: 
                   1387: 
                   1388: #define INDEXABLE_ADDRESS_P(X,MODE)                                 \
                   1389:    ((GET_CODE(X) == PLUS && GET_CODE (XEXP (X,0)) == REG &&         \
                   1390:      XEXP(X,0) == stack_pointer_rtx && YBASE_OFFSET(XEXP(X,1)) &&   \
                   1391:      !ILLEGAL_HIMODE_ADDR(MODE, INTVAL(XEXP(X,1)))) ||              \
                   1392:     (GET_CODE(X) == PLUS && GET_CODE (XEXP (X,1)) == REG &&         \
                   1393:      XEXP(X,1) == stack_pointer_rtx && YBASE_OFFSET(XEXP(X,0)) &&  \
                   1394:      !ILLEGAL_HIMODE_ADDR(MODE, INTVAL(XEXP(X,0)))))
                   1395: 
                   1396: #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR)                     \
                   1397: {                                                                  \
                   1398:     if (INDIRECTABLE_ADDRESS_P(X))                                  \
                   1399:         goto ADDR;                                                  \
                   1400: }
                   1401: 
                   1402: 
                   1403: /* Try machine-dependent ways of modifying an illegitimate address
                   1404:    to be legitimate.  If we find one, return the new, valid address.
                   1405:    This macro is used in only one place: `memory_address' in explow.c.
                   1406: 
                   1407:    OLDX is the address as it was before break_out_memory_refs was called.
                   1408:    In some cases it is useful to look at this to decide what needs to be done.
                   1409: 
                   1410:    MODE and WIN are passed so that this macro can use
                   1411:    GO_IF_LEGITIMATE_ADDRESS.
                   1412: 
                   1413:    It is always safe for this macro to do nothing.  It exists to recognize
                   1414:    opportunities to optimize the output.
                   1415: 
                   1416:    For the 1610, we need not do anything.  However, if we don't,
                   1417:    `memory_address' will try lots of things to get a valid address, most of
                   1418:    which will result in dead code and extra pseudos.  So we make the address
                   1419:    valid here.
                   1420: 
                   1421:    This is easy:  The only valid addresses are an offset from a register
                   1422:    and we know the address isn't valid.  So just call either `force_operand'
                   1423:    or `force_reg' unless this is a (plus (reg ...) (const_int 0)).  */
                   1424: 
                   1425: #define LEGITIMIZE_ADDRESS(X,OLDX,MODE,WIN)                    \
                   1426: { if (GET_CODE (X) == PLUS && XEXP (X, 1) == const0_rtx)       \
                   1427:     X = XEXP (x, 0);                                           \
                   1428:   if (GET_CODE (X) == MULT || GET_CODE (X) == PLUS)            \
                   1429:     X = force_operand (X, 0);                                  \
                   1430:   else                                                         \
                   1431:     X = force_reg (Pmode, X);                                  \
                   1432:   goto WIN;                                                    \
                   1433: }
                   1434: 
                   1435: /* Go to LABEL if ADDR (a legitimate address expression)
                   1436:    has an effect that depends on the machine mode it is used for.
                   1437:    On the 1610, only postdecrement and postincrement address depend thus
                   1438:    (the amount of decrement or increment being the length of the operand).  */
                   1439: 
                   1440: #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)       \
                   1441:  if (GET_CODE (ADDR) == POST_INC || GET_CODE (ADDR) == POST_DEC) goto LABEL
                   1442: 
                   1443: /* Nonzero if the constant value X is a legitimate general operand.
                   1444:    It is given that X satisfies CONSTANT_P or is a CONST_DOUBLE.  */
                   1445: #define LEGITIMATE_CONSTANT_P(X) (1)
                   1446: 
                   1447: 
                   1448: /* CONDITION CODE INFORMATION */
                   1449: 
                   1450: /* Store in cc_status the expressions
                   1451:    that the condition codes will describe
                   1452:    after execution of an instruction whose pattern is EXP.
                   1453:    Do not alter them if the instruction would not alter the cc's. */
                   1454: 
                   1455: #define NOTICE_UPDATE_CC(EXP, INSN) \
                   1456:    notice_update_cc( (EXP) )
                   1457: 
                   1458: /* DESCRIBING RELATIVE COSTS OF OPERATIONS */
                   1459: 
                   1460: /* Compute the cost of computing a constant rtl expression RTX
                   1461:    whose rtx-code is CODE.  The body of this macro is a portion
                   1462:    of a switch statement.  If the code is computed here,
                   1463:    return it with a return statement. */
                   1464: #define CONST_COSTS(RTX,CODE,OUTER_CODE)                                \
                   1465:   case CONST_INT:                                                      \
                   1466:     return 0;                                                           \
                   1467:   case LABEL_REF:                                                      \
                   1468:   case SYMBOL_REF:                                                     \
                   1469:   case CONST:                                                          \
                   1470:     return COSTS_N_INSNS (1);                                          \
                   1471:                                                                         \
                   1472:   case CONST_DOUBLE:                                                   \
                   1473:     return COSTS_N_INSNS (2);
                   1474: 
1.1.1.2 ! root     1475: /* Like CONST_COSTS but applies to nonconstant RTL expressions.
1.1       root     1476:    This can be used, for example to indicate how costly a multiply
                   1477:    instruction is. */
                   1478: #define RTX_COSTS(X,CODE,OUTER_CODE)                            \
                   1479:   case MEM:                                                     \
                   1480:     return GET_MODE (X) == QImode ? COSTS_N_INSNS (2) :         \
                   1481:                                     COSTS_N_INSNS (4);          \
                   1482:   case DIV:                                                     \
                   1483:   case MOD:                                                     \
                   1484:     return COSTS_N_INSNS (38);                                  \
                   1485:   case MULT:                                                    \
                   1486:     if (GET_MODE (X) == QImode)                                 \
                   1487:         return COSTS_N_INSNS (2);                               \
                   1488:     else                                                        \
                   1489:         return COSTS_N_INSNS (38);                              \
                   1490:   case PLUS:                                                    \
                   1491:     if (GET_MODE_CLASS (GET_MODE (X)) == MODE_INT)              \
                   1492:     {                                                           \
                   1493:         if (GET_CODE (XEXP (X,1)) == CONST_INT)                 \
                   1494:         {                                                       \
                   1495:             int number = INTVAL(XEXP (X,1));                    \
                   1496:             if (number == 1)                                    \
                   1497:                return COSTS_N_INSNS (1);                        \
                   1498:             if (INT_FITS_16_BITS(number))                       \
                   1499:                 return COSTS_N_INSNS (2);                       \
                   1500:             else                                                \
                   1501:                 return COSTS_N_INSNS (4);                       \
                   1502:         }                                                       \
                   1503:         return COSTS_N_INSNS (1);                               \
                   1504:     }                                                           \
                   1505:     else                                                        \
                   1506:         return COSTS_N_INSNS (38);                              \
                   1507:   case MINUS:                                                   \
                   1508:     if (GET_MODE_CLASS (GET_MODE (X)) == MODE_INT)              \
                   1509:     {                                                           \
                   1510:         if (GET_CODE (XEXP (X,1)) == CONST_INT)                 \
                   1511:         {                                                       \
                   1512:             if (INT_FITS_16_BITS(INTVAL(XEXP(X,1))))            \
                   1513:                 return COSTS_N_INSNS (2);                       \
                   1514:             else                                                \
                   1515:                 return COSTS_N_INSNS (4);                       \
                   1516:         }                                                       \
                   1517:         return COSTS_N_INSNS (1);                               \
                   1518:     }                                                           \
                   1519:     else                                                        \
                   1520:         return COSTS_N_INSNS (38);                              \
                   1521:   case AND: case IOR: case XOR:                                 \
                   1522:     if (GET_CODE (XEXP (X,1)) == CONST_INT)                     \
                   1523:       {                                                         \
                   1524:         if (INT_FITS_16_BITS(INTVAL(XEXP(X,1))))                \
                   1525:             return COSTS_N_INSNS (2);                           \
                   1526:         else                                                    \
                   1527:             return COSTS_N_INSNS (4);                           \
                   1528:       }                                                         \
                   1529:     return COSTS_N_INSNS (1);                                   \
                   1530:   case NEG: case NOT:                                           \
                   1531:     return COSTS_N_INSNS (1);                                   \
                   1532:   case ASHIFT:                                                  \
                   1533:   case ASHIFTRT:                                                \
                   1534:   case LSHIFTRT:                                                \
                   1535:     if (GET_CODE (XEXP (X,1)) == CONST_INT)                     \
                   1536:       {                                                         \
                   1537:         int number = INTVAL(XEXP (X,1));                        \
                   1538:         if (number == 1 || number == 4 || number == 8 ||        \
                   1539:             number == 16)                                       \
                   1540:             return COSTS_N_INSNS (1);                           \
                   1541:         else                                                    \
                   1542:             return COSTS_N_INSNS (2);                           \
                   1543:       }                                                         \
                   1544:     return COSTS_N_INSNS (1);
                   1545: 
                   1546: /* An expression giving the cost of an addressing mode that contains
                   1547:    address. */
                   1548: #define ADDRESS_COST(ADDR)  dsp16xx_address_cost (ADDR)
                   1549: 
                   1550: /* A c expression for the cost of moving data from a register in
                   1551:    class FROM to one in class TO. The classes are expressed using
                   1552:    the enumeration values such as GENERAL_REGS. A value of 2 is
                   1553:    the default. */
                   1554: #define REGISTER_MOVE_COST(FROM,TO)  dsp16xx_register_move_cost (FROM, TO)
                   1555: 
                   1556: /* A C expression for the cost of moving data of mode MODE between
                   1557:    a register and memory. A value of 2 is the default. */
                   1558: #define MEMORY_MOVE_COST(MODE)                                  \
                   1559:   (GET_MODE_CLASS(MODE) == MODE_INT && MODE == QImode ? 12       \
                   1560:    : 16)
                   1561: 
                   1562: /* A C expression for the cost of a branch instruction. A value of
                   1563:    1 is the default; */
                   1564: #define BRANCH_COST 2
                   1565: 
                   1566: 
                   1567: /* Define this because otherwise gcc will try to put the function address
                   1568:    in any old pseudo register. We can only use pt. */
                   1569: #define NO_FUNCTION_CSE
                   1570: 
                   1571: /* Define this macro as a C expression which is nonzero if accessing less
                   1572:    than a word of memory (i.e a char or short) is no faster than accessing
                   1573:    a word of memory, i.e if such access require more than one instruction
                   1574:    or if ther is no difference in cost between byte and (aligned) word
                   1575:    loads. */
                   1576: #define SLOW_BYTE_ACCESS 1
                   1577: 
                   1578: /* Define this macro if zero-extension (of a char or short to an int) can
                   1579:    be done faster if the destination is a register that is know to be zero. */
                   1580: /* #define SLOW_ZERO_EXTEND */
                   1581: 
                   1582: /* Define this macro if unaligned accesses have a cost many times greater than
                   1583:    aligned accesses, for example if they are emulated in a trap handler */
                   1584: /* define SLOW_UNALIGNED_ACCESS */
                   1585: 
                   1586: /* Define this macro to inhibit strength reduction of memory addresses */
                   1587: /* #define DONT_REDUCE_ADDR */
                   1588: 
                   1589: 
                   1590: /* DIVIDING THE OUTPUT IN SECTIONS */
                   1591: /* Output before read-only data.  */
                   1592: 
                   1593: #define DEFAULT_TEXT_SEG_NAME ".text"
                   1594: #define TEXT_SECTION_ASM_OP  rsect_text
                   1595: 
                   1596: /* Output before constants and strings */
                   1597: #define DEFAULT_CONST_SEG_NAME  ".const"
                   1598: #define READONLY_SECTION_ASM_OP rsect_const
                   1599: #define READONLY_DATA_SECTION   const_section
                   1600: 
                   1601: /* Output before writable data.  */
                   1602: #define DEFAULT_DATA_SEG_NAME ".data"
                   1603: #define DATA_SECTION_ASM_OP  rsect_data
                   1604: 
                   1605: #define DEFAULT_BSS_SEG_NAME ".bss"
                   1606: #define BSS_SECTION_ASM_OP rsect_bss
                   1607: 
                   1608: /* We will default to using 1610 if the user doesn't
                   1609:    specify it. */
                   1610: #define DEFAULT_CHIP_NAME "1610"
                   1611: 
                   1612: /* A list of names for sections other than the standard two, which are
                   1613:    'in_text' and 'in_data'. */
                   1614: #define EXTRA_SECTIONS in_bss, in_const
                   1615: 
                   1616: #define EXTRA_SECTION_FUNCTIONS  \
                   1617: void                                                               \
                   1618: const_section ()                                                   \
                   1619: {                                                                  \
                   1620:     if (in_section != in_const)                                    \
                   1621:     {                                                              \
                   1622:         fprintf (asm_out_file, "%s\n", READONLY_SECTION_ASM_OP);   \
                   1623:        in_section = in_const;                                     \
                   1624:     }                                                              \
                   1625: }                                                                  \
                   1626: void                                                              \
                   1627: bss_section ()                                                    \
                   1628: {                                                                 \
                   1629:     if (in_section != in_bss) {                                           \
                   1630:        fprintf (asm_out_file, "%s\n", BSS_SECTION_ASM_OP);        \
                   1631:        in_section = in_bss;                                       \
                   1632:     }                                                             \
                   1633: }
                   1634: 
                   1635: 
                   1636: /* THE OVERALL FRAMEWORK OF AN ASSEMBLER FILE */
                   1637: 
                   1638: /* Output at beginning of assembler file.  */
                   1639: #define ASM_FILE_START(FILE) dsp16xx_file_start () 
                   1640: 
                   1641: /* Prevent output of .gcc_compiled */
                   1642: #define ASM_IDENTIFY_GCC(FILE)   
                   1643: 
                   1644: /* A C string constant describing how to begin a comment in the target
                   1645:    assembler language. */
                   1646: /* define ASM_COMMENT_START */
                   1647: 
                   1648: /* Output to assembler file text saying following lines
                   1649:    may contain character constants, extra white space, comments, etc.  */
                   1650: #define ASM_APP_ON ""
                   1651: 
                   1652: /* Output to assembler file text saying following lines
                   1653:    no longer contain unusual constructs.  */
                   1654: #define ASM_APP_OFF ""
                   1655: 
                   1656: /* OUTPUT OF DATA */
                   1657: 
                   1658: /* This is how to output an assembler line defining a `double' constant.  */
                   1659: #define ASM_OUTPUT_DOUBLE(FILE,VALUE)  asm_output_float (FILE,VALUE)
                   1660: 
                   1661: /* This is how to output an assembler line defining a `float' constant.  */
                   1662: #define ASM_OUTPUT_FLOAT(FILE,VALUE)  asm_output_float (FILE, VALUE)
                   1663: 
                   1664: /* This is how to output and assembler line defininf a 'float' constant of
                   1665:    size HFmode. */
                   1666: #define ASM_OUTPUT_SHORT_FLOAT(FILE,VALUE)  asm_output_float (FILE, VALUE)
                   1667: 
                   1668: /* This is how to output an assembler line defining an `char' constant.  */
                   1669: #define ASM_OUTPUT_CHAR(FILE,VALUE)              \
                   1670: ( fprintf (FILE, "\tint "),                    \
                   1671:   output_addr_const (FILE, (VALUE)),           \
                   1672:   fprintf (FILE, "\n"))
                   1673: 
                   1674: /* This is how to output an assembler line defining an `short' constant.  */
                   1675: #define ASM_OUTPUT_SHORT(FILE,EXP)   asm_output_long(FILE,INTVAL(EXP))
                   1676: 
                   1677: /* This is how to output an assembler line defining a 'int' constant. */
                   1678: #define ASM_OUTPUT_INT(FILE, EXP)    asm_output_long(FILE,INTVAL(EXP))
                   1679: 
                   1680: /* This is how to output an assembler line for a numeric constant byte.  */
                   1681: #define ASM_OUTPUT_BYTE(FILE,VALUE)    ASM_OUTPUT_CHAR(FILE,VALUE)
                   1682: 
                   1683: /* This is how we output a 'c' character string. For the 16xx
                   1684:    assembler we have to do it one letter at a time */
                   1685: 
                   1686: #define ASCII_LENGTH 10
                   1687: 
                   1688: #define ASM_OUTPUT_ASCII(MYFILE, MYSTRING, MYLENGTH) \
                   1689:   do {                                                                       \
                   1690:     FILE *_hide_asm_out_file = (MYFILE);                                     \
                   1691:     unsigned char *_hide_p = (unsigned char *) (MYSTRING);                   \
                   1692:     int _hide_thissize = (MYLENGTH);                                         \
                   1693:     {                                                                        \
                   1694:       FILE *asm_out_file = _hide_asm_out_file;                               \
                   1695:       unsigned char *p = _hide_p;                                            \
                   1696:       int thissize = _hide_thissize;                                         \
                   1697:       int i;                                                                 \
                   1698:                                                                              \
                   1699:       for (i = 0; i < thissize; i++)                                         \
                   1700:        {                                                                     \
                   1701:          register int c = p[i];                                              \
                   1702:                                                                              \
                   1703:          if (i % ASCII_LENGTH == 0) \
                   1704:            fprintf (asm_out_file, "\tint ");                                 \
                   1705:                                                                        \
                   1706:          if (c >= ' ' && c < 0177 && c != '\'')                              \
                   1707:          {                                                                   \
                   1708:            putc ('\'', asm_out_file);                                        \
                   1709:            putc (c, asm_out_file);                                           \
                   1710:            putc ('\'', asm_out_file);                                        \
                   1711:          }                                                                   \
                   1712:          else                                                                \
                   1713:            {                                                                 \
                   1714:              fprintf (asm_out_file, "%d", c);                                \
                   1715:              /* After an octal-escape, if a digit follows,                   \
                   1716:                 terminate one string constant and start another.             \
                   1717:                 The Vax assembler fails to stop reading the escape           \
                   1718:                 after three digits, so this is the only way we               \
                   1719:                 can get it to parse the data properly.                       \
                   1720:              if (i < thissize - 1                                            \
                   1721:                  && p[i + 1] >= '0' && p[i + 1] <= '9')                      \
                   1722:                fprintf (asm_out_file, "\'\n\tint \'");                       \
                   1723:                */ \
                   1724:          }                                                                   \
                   1725:          /* if: \
                   1726:             we are not at the last char (i != thissize -1) \
                   1727:             and (we are not at a line break multiple  \
                   1728:             but i == 0) (it will be the very first time) \
                   1729:             then put out a comma to extend. \
                   1730:           */ \
                   1731:          if ((i != thissize - 1) && ((i + 1) % ASCII_LENGTH))        \
                   1732:            fprintf(asm_out_file, ",");                               \
                   1733:          if (!((i + 1) % ASCII_LENGTH)) \
                   1734:            fprintf (asm_out_file, "\n");                             \
                   1735:        }                                                                     \
                   1736:       fprintf (asm_out_file, "\n");                                          \
                   1737:     }                                                                        \
                   1738:   }                                                                          \
                   1739:   while (0)
                   1740: 
                   1741: /* Store in OUTPUT a string (made with alloca) containing
                   1742:    an assembler-name for a local static variable or function
                   1743:    named NAME. LABELNO is an integer which is different for
                   1744:    each call. */
                   1745: 
                   1746: #define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO)                 \
                   1747:   do {                                                                 \
                   1748:     int len = strlen (NAME);                                           \
                   1749:     char *temp = (char *) alloca (len + 3);                            \
                   1750:     temp[0] = 'L';                                                     \
                   1751:     strcpy (&temp[1], (NAME));                                         \
                   1752:     temp[len + 1] = '_';                                               \
                   1753:     temp[len + 2] = 0;                                                 \
                   1754:     (OUTPUT) = (char *) alloca (strlen (NAME) + 11);                   \
                   1755:     ASM_GENERATE_INTERNAL_LABEL (OUTPUT, temp, LABELNO);               \
                   1756:   } while (0)
                   1757: 
                   1758: #define ASM_OPEN_PAREN "("
                   1759: #define ASM_CLOSE_PAREN ")"
                   1760: 
                   1761: 
                   1762: /* OUTPUT OF UNINITIALIZED VARIABLES */
                   1763: 
                   1764: /* This says how to output an assembler line
                   1765:    to define a global common symbol.  */
                   1766: 
                   1767: #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED)  \
                   1768:   asm_output_common (FILE, NAME, SIZE, ROUNDED);
                   1769: 
                   1770: /* This says how to output an assembler line
                   1771:    to define a local common symbol.  */
                   1772: 
                   1773: #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED)  \
                   1774:   asm_output_local (FILE, NAME, SIZE, ROUNDED);
                   1775: 
                   1776: /* OUTPUT AND GENERATION OF LABELS */
                   1777: 
                   1778: /* This is how to output the definition of a user-level label named NAME,
                   1779:    such as the label on a static function or variable NAME.  */
                   1780: #define ASM_OUTPUT_LABEL(FILE,NAME)    \
                   1781:   do { assemble_name (FILE, NAME); fputs (":\n", FILE); } while (0)
                   1782: 
                   1783: /* This is how to output a command to make the user-level label named NAME
                   1784:    defined for reference from other files.  */
                   1785: 
                   1786: #define ASM_GLOBALIZE_LABEL(FILE,NAME) \
                   1787:   do { fputs (".global ", FILE); assemble_name (FILE, NAME); fputs ("\n", FILE);} while (0)
                   1788: 
                   1789: /* A C statement to output to the stdio stream any text necessary
                   1790:    for declaring the name of an external symbol named name which
                   1791:    is referenced in this compilation but not defined. */
                   1792: 
                   1793: #define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME)   \
                   1794: {                                      \
                   1795:        fprintf (FILE, ".extern ");     \
                   1796:        assemble_name (FILE, NAME);     \
                   1797:        fprintf (FILE, "\n");           \
                   1798: }
                   1799: /* A C statement to output on stream an assembler pseudo-op to
                   1800:    declare a library function named external. */
                   1801: 
                   1802: #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN)    \
                   1803: {                                              \
                   1804:        fprintf (FILE, ".extern ");             \
                   1805:        assemble_name (FILE, XSTR (FUN, 0));    \
                   1806:        fprintf (FILE, "\n");                   \
                   1807: }
                   1808: /* This is how to output a reference to a user-level label named NAME.
                   1809:    `assemble_name' uses this.  */
                   1810: #define ASM_OUTPUT_LABELREF(FILE,NAME) \
                   1811:   fprintf (FILE, "_%s", NAME)
                   1812: 
                   1813: /* This is how to output an internal numbered label where
                   1814:    PREFIX is the class of label and NUM is the number within the class.  */
                   1815: #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM)     \
                   1816:   fprintf (FILE, "%s%d:\n", PREFIX, NUM)
                   1817: 
                   1818: /* This is how to store into the string LABEL
                   1819:    the symbol_ref name of an internal numbered label where
                   1820:    PREFIX is the class of label and NUM is the number within the class.
                   1821:    This is suitable for output with `assemble_name'.  */
                   1822: #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM)  \
                   1823:   sprintf (LABEL, "*%s%d", PREFIX, NUM)
                   1824: 
                   1825: 
                   1826: /* OUTPUT OF ASSEMBLER INSTRUCTIONS */
                   1827: 
                   1828: /* How to refer to registers in assembler output.
                   1829:    This sequence is indexed by compiler's hard-register-number (see above).  */
                   1830: 
                   1831: #define REGISTER_NAMES \
                   1832: {"a0", "a0l", "a1", "a1l", "x", "y", "yl", "p", "pl",  \
                   1833:  "r0", "r1", "r2",  "r3", "j", "k", "ybase", "pt",     \
                   1834:  "ar0", "ar1", "ar2", "ar3",                           \
                   1835:  "c0", "c1", "c2", "pr", "rb",                         \
                   1836:  "*(0)", "*(1)", "*(2)", "*(3)", "*(4)", "*(5)",       \
                   1837:  "*(6)", "*(7)", "*(8)", "*(9)", "*(10)", "*(11)",     \
                   1838:  "*(12)", "*(13)", "*(14)", "*(15)", "*(16)", "*(17)", \
                   1839:  "*(18)", "*(19)", "*(20)", "*(21)", "*(22)", "*(23)", \
                   1840:  "*(24)", "*(25)", "*(26)", "*(27)", "*(28)", "*(29)", \
                   1841:  "*(30)", "*(31)" }
                   1842: 
                   1843: #define HIMODE_REGISTER_NAMES \
                   1844: {"a0", "a0", "a1", "a1", "x", "y", "y", "p", "p",  \
                   1845:  "r0", "r1", "r2",  "r3", "j", "k", "ybase", "pt",     \
                   1846:  "ar0", "ar1", "ar2", "ar3",                           \
                   1847:  "c0", "c1", "c2", "pr", "rb",                         \
                   1848:  "*(0)", "*(1)", "*(2)", "*(3)", "*(4)", "*(5)",       \
                   1849:  "*(6)", "*(7)", "*(8)", "*(9)", "*(10)", "*(11)",     \
                   1850:  "*(12)", "*(13)", "*(14)", "*(15)", "*(16)", "*(17)", \
                   1851:  "*(18)", "*(19)", "*(20)", "*(21)", "*(22)", "*(23)", \
                   1852:  "*(24)", "*(25)", "*(26)", "*(27)", "*(28)", "*(29)", \
                   1853:  "*(30)", "*(31)" }
                   1854: 
                   1855: #define PRINT_OPERAND_PUNCT_VALID_P(CODE)  0
                   1856: 
                   1857: /* Print operand X (an rtx) in assembler syntax to file FILE.
                   1858:    CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
                   1859:    For `%' followed by punctuation, CODE is the punctuation and X is null.
                   1860:    
                   1861:    DSP1610 extensions for operand codes:
                   1862: 
                   1863:    %H - print lower 16 bits of constant
                   1864:    %U - print upper 16 bits of constant
                   1865:    %w - print low half of register (e.g 'a0l')
                   1866:    %u - print upper half of register (e.g 'a0')
                   1867:    %b - print high half of accumulator for F3 ALU instructions
                   1868:    %h - print constant in decimal   */
                   1869: 
                   1870: #define PRINT_OPERAND(FILE, X, CODE) print_operand(FILE, X, CODE)
                   1871: 
                   1872: 
                   1873: /* Print a memory address as an operand to reference that memory location. */
                   1874: 
                   1875: #define PRINT_OPERAND_ADDRESS(FILE, ADDR)  print_operand_address (FILE, ADDR)
                   1876: 
                   1877: /* This is how to output an insn to push a register on the stack.
                   1878:    It need not be very fast code since it is used only for profiling  */
                   1879: #define ASM_OUTPUT_REG_PUSH(FILE,REGNO)    fatal("Profiling not implemented yet.");
                   1880: 
                   1881: /* This is how to output an insn to pop a register from the stack.
                   1882:    It need not be very fast code since it is used only for profiling  */
                   1883: #define ASM_OUTPUT_REG_POP(FILE,REGNO)     fatal("Profiling not implemented yet."); 
                   1884: 
                   1885: /* OUTPUT OF DISPATCH TABLES */
                   1886: 
                   1887: /* This macro should be provided on machines where the addresses in a dispatch
                   1888:    table are relative to the table's own address. */
                   1889: #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL)  \
                   1890:   fprintf (FILE, "\tint L%d-L%d\n", VALUE, REL)
                   1891: 
                   1892: /* This macro should be provided on machines where the addresses in a dispatch
                   1893:    table are absolute. */
                   1894: #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE)  \
                   1895:   fprintf (FILE, "\tint L%d\n", VALUE)
                   1896: 
                   1897: /* ASSEMBLER COMMANDS FOR ALIGNMENT */
                   1898: 
                   1899: /* This is how to output an assembler line that says to advance 
                   1900:    the location counter to a multiple of 2**LOG bytes. We should
1.1.1.2 ! root     1901:    not have to do any alignment since the 1610 is a word machine. */
1.1       root     1902: #define ASM_OUTPUT_ALIGN(FILE,LOG)
                   1903: 
                   1904: /* Define this macro if ASM_OUTPUT_SKIP should not be used in the text section
                   1905:    because it fails to put zero1 in the bytes that are skipped. */
                   1906: #define ASM_NO_SKIP_IN_TEXT 1
                   1907: 
                   1908: #define ASM_OUTPUT_SKIP(FILE,SIZE)  \
                   1909:   fprintf (FILE, "\t%d * int 0\n", (SIZE))
                   1910: 
                   1911: /* CONTROLLING DEBUGGING INFORMATION FORMAT */
                   1912: 
                   1913: /* Define this macro if GCC should produce COFF-style debugging output
                   1914:    for SDB in response to the '-g' option */
                   1915: #define SDB_DEBUGGING_INFO
                   1916: 
                   1917: /* Support generating stabs for the listing file generator */
                   1918: #define DBX_DEBUGGING_INFO
                   1919: 
                   1920: /* The default format when -g is given is still COFF debug info */
                   1921: #define PREFERRED_DEBUGGING_TYPE SDB_DEBUG
                   1922: 
                   1923: #define DBX_REGISTER_NUMBER(REGNO)   (REGNO)
                   1924: 
                   1925: /* MISCELLANEOUS PARAMETERS */
                   1926: 
                   1927: /* Specify the machine mode that this machine uses
                   1928:    for the index in the tablejump instruction.  */
                   1929: #define CASE_VECTOR_MODE QImode
                   1930: 
                   1931: /* Define this if the tablejump instruction expects the table
                   1932:    to contain offsets from the address of the table.
                   1933:    Do not define this if the table should contain absolute addresses.  */
                   1934: /* #define CASE_VECTOR_PC_RELATIVE  */
                   1935: 
                   1936: /* Specify the tree operation to be used to convert reals to integers.  */
                   1937: #define IMPLICIT_FIX_EXPR FIX_ROUND_EXPR
                   1938: 
                   1939: /* This is the kind of divide that is easiest to do in the general case.  */
                   1940: #define EASY_DIV_EXPR TRUNC_DIV_EXPR
                   1941: 
                   1942: /* Max number of bytes we can move from memory to memory
                   1943:    in one reasonably fast instruction.  */
                   1944: #define MOVE_MAX 1
                   1945: 
                   1946: /* Defining this macro causes the compiler to omit a sign-extend, zero-extend,
                   1947:    or bitwise 'and' instruction that truncates the count of a shift operation
                   1948:    to a width equal to the number of bits needed to represent the size of the
1.1.1.2 ! root     1949:    object being shifted. Do not define this macro unless the truncation applies
        !          1950:    to both shift operations and bit-field operations (if any). */
1.1       root     1951: /* #define SHIFT_COUNT_TRUNCATED */
                   1952: 
                   1953: /* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
                   1954:    is done just by pretending it is already truncated.  */
                   1955: #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
                   1956: 
                   1957: /* When a prototype says `char' or `short', really pass an `int'.  */
                   1958: #define PROMOTE_PROTOTYPES
                   1959: 
                   1960: /* An alias for the machine mode used for pointers */
                   1961: #define Pmode  QImode
                   1962: 
                   1963: /* A function address in a call instruction
                   1964:    is a byte address (for indexing purposes)
                   1965:    so give the MEM rtx a byte's mode.  */
                   1966: #define FUNCTION_MODE  QImode
                   1967: 
                   1968: #if !defined(__DATE__)
                   1969: #define TARGET_VERSION fprintf (stderr, " (%s)", VERSION_INFO1)
                   1970: #else
                   1971: #define TARGET_VERSION fprintf (stderr, " (%s, %s)", VERSION_INFO1, __DATE__)
                   1972: #endif
                   1973: 
                   1974: #define VERSION_INFO1 "AT&T DSP16xx C Cross Compiler, version 1.2.0"
                   1975: 
                   1976: 
                   1977: /* Define this as 1 if `char' should by default be signed; else as 0.  */
                   1978: #define DEFAULT_SIGNED_CHAR 1
                   1979: 
                   1980: /* If this macro is defined, GNU CC gathers statistics about the number and
                   1981:    kind of tree node it allocates during each run. The option '-fstats' will
                   1982:    tell the compiler to print these statistics about the sizes of it obstacks. */
                   1983: #define GATHER_STATISTICS
                   1984: 
                   1985: /* Define this so gcc does not output a call to __main, since we
                   1986:    are not currently supporting c++. */
                   1987: #define INIT_SECTION_ASM_OP  1

unix.superglobalmegacorp.com

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