|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.