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

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