OSDN Git Service

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