OSDN Git Service

PR target/37362
[pf3gnuchains/gcc-fork.git] / gcc / config / mmix / mmix.h
1 /* Definitions of target machine for GNU compiler, for MMIX.
2    Copyright (C) 2000, 2001, 2002, 2004, 2005, 2007 Free Software Foundation, Inc.
3    Contributed by Hans-Peter Nilsson (hp@bitrange.com)
4
5 This file is part of GCC.
6
7 GCC 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 3, or (at your option)
10 any later version.
11
12 GCC 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 GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20
21 #ifndef GCC_MMIX_H
22 #define GCC_MMIX_H
23
24 /* First, some local helper macros.  Note that the "default" value of
25    FIXED_REGISTERS, CALL_USED_REGISTERS, REG_ALLOC_ORDER and
26    REG_CLASS_CONTENTS depend on these values.  */
27 #define MMIX_RESERVED_GNU_ARG_0_REGNUM 231
28 #define MMIX_FIRST_ARG_REGNUM \
29   (TARGET_ABI_GNU ? MMIX_RESERVED_GNU_ARG_0_REGNUM : 16)
30 #define MMIX_FIRST_INCOMING_ARG_REGNUM \
31   (TARGET_ABI_GNU ? MMIX_RESERVED_GNU_ARG_0_REGNUM : 0)
32 #define MMIX_MAX_ARGS_IN_REGS 16
33
34 /* FIXME: This one isn't fully implemented yet.  Return values larger than
35    one register are passed by reference in MMIX_STRUCT_VALUE_REGNUM by the
36    caller, except for return values of type "complex".  */
37 #define MMIX_MAX_REGS_FOR_VALUE 16
38 #define MMIX_RETURN_VALUE_REGNUM \
39   (TARGET_ABI_GNU ? MMIX_RESERVED_GNU_ARG_0_REGNUM : 15)
40 #define MMIX_OUTGOING_RETURN_VALUE_REGNUM \
41   (TARGET_ABI_GNU ? MMIX_RESERVED_GNU_ARG_0_REGNUM : 0)
42 #define MMIX_STRUCT_VALUE_REGNUM 251
43 #define MMIX_STATIC_CHAIN_REGNUM 252
44 #define MMIX_FRAME_POINTER_REGNUM 253
45 #define MMIX_STACK_POINTER_REGNUM 254
46 #define MMIX_LAST_GENERAL_REGISTER 255
47 #define MMIX_INCOMING_RETURN_ADDRESS_REGNUM MMIX_rJ_REGNUM
48 #define MMIX_HIMULT_REGNUM 258
49 #define MMIX_REMAINDER_REGNUM MMIX_rR_REGNUM
50 #define MMIX_ARG_POINTER_REGNUM 261
51 #define MMIX_rO_REGNUM 262
52 #define MMIX_LAST_STACK_REGISTER_REGNUM 31
53
54 /* Four registers; "ideally, these registers should be call-clobbered", so
55    just grab a bunch of the common clobbered registers.  FIXME: Last
56    registers of return-value should be used, with an error if there's a
57    return-value (that collides in size).  */
58 #define MMIX_EH_RETURN_DATA_REGNO_START (MMIX_STRUCT_VALUE_REGNUM - 4)
59
60 /* Try to keep the definitions from running away on their own.  */
61 #if (MMIX_EH_RETURN_DATA_REGNO_START \
62      != MMIX_RESERVED_GNU_ARG_0_REGNUM + MMIX_MAX_ARGS_IN_REGS)
63  #error MMIX register definition inconsistency
64 #endif
65
66 #if (MMIX_MAX_REGS_FOR_VALUE + MMIX_MAX_ARGS_IN_REGS > 32)
67  #error MMIX parameters and return values bad, more than 32 registers
68 #endif
69
70 /* This chosen as "a call-clobbered hard register that is otherwise
71    untouched by the epilogue".  */
72 #define MMIX_EH_RETURN_STACKADJ_REGNUM MMIX_STATIC_CHAIN_REGNUM
73
74 #ifdef REG_OK_STRICT
75 # define MMIX_REG_OK_STRICT 1
76 #else
77 # define MMIX_REG_OK_STRICT 0
78 #endif
79
80 #define MMIX_FUNCTION_ARG_SIZE(MODE, TYPE) \
81  ((MODE) != BLKmode ? GET_MODE_SIZE (MODE) : int_size_in_bytes (TYPE))
82
83 /* Declarations for helper variables that are not tied to a particular
84    target macro.  */
85 extern GTY(()) rtx mmix_compare_op0;
86 extern GTY(()) rtx mmix_compare_op1;
87
88 /* Per-function machine data.  This is normally an opaque type just
89    defined and used in the tm.c file, but we need to see the definition in
90    mmix.md too.  */
91 struct machine_function GTY(())
92  {
93    int has_landing_pad;
94    int highest_saved_stack_register;
95    int in_prologue;
96  };
97
98 /* For these target macros, there is no generic documentation here.  You
99    should read `Using and Porting GCC' for that.  Only comments specific
100    to the MMIX target are here.
101
102    There are however references to the specific texinfo node (comments
103    with "Node:"), so there should be little or nothing amiss.  Probably
104    the opposite, since we don't have to care about old littering and
105    soon outdated generic comments.  */
106
107 /* Node: Driver */
108
109 /* User symbols are in the same name-space as built-in symbols, but we
110    don't need the built-in symbols, so remove those and instead apply
111    stricter operand checking.  Don't warn when expanding insns.  */
112 #define ASM_SPEC "-no-predefined-syms -x"
113
114 /* Pass on -mset-program-start=N and -mset-data-start=M to the linker.
115    Provide default program start 0x100 unless -mno-set-program-start.
116    Don't do this if linking relocatably, with -r.  For a final link,
117    produce mmo, unless ELF is requested or when linking relocatably.  */
118 #define LINK_SPEC \
119  "%{mset-program-start=*:--defsym __.MMIX.start..text=%*}\
120   %{mset-data-start=*:--defsym __.MMIX.start..data=%*}\
121   %{!mset-program-start=*:\
122     %{!mno-set-program-start:\
123      %{!r:--defsym __.MMIX.start..text=0x100}}}\
124   %{!melf:%{!r:-m mmo}}%{melf|r:-m elf64mmix}"
125
126 /* FIXME: There's no provision for profiling here.  */
127 #define STARTFILE_SPEC  \
128   "crti%O%s crtbegin%O%s"
129
130 #define ENDFILE_SPEC "crtend%O%s crtn%O%s"
131
132 /* Node: Run-time Target */
133
134 /* Define __LONG_MAX__, since we're advised not to change glimits.h.  */
135 #define TARGET_CPU_CPP_BUILTINS()                               \
136   do                                                            \
137     {                                                           \
138       builtin_define ("__mmix__");                              \
139       builtin_define ("__MMIX__");                              \
140       if (TARGET_ABI_GNU)                                       \
141         builtin_define ("__MMIX_ABI_GNU__");                    \
142       else                                                      \
143         builtin_define ("__MMIX_ABI_MMIXWARE__");               \
144     }                                                           \
145   while (0)
146
147 extern int target_flags;
148
149 #define TARGET_DEFAULT \
150  (MASK_BRANCH_PREDICT | MASK_BASE_ADDRESSES | MASK_USE_RETURN_INSN)
151
152 /* Unfortunately, this must not reference anything in "mmix.c".  */
153 #define TARGET_VERSION \
154   fprintf (stderr, " (MMIX)")
155
156 #define OVERRIDE_OPTIONS mmix_override_options ()
157
158 #define OPTIMIZATION_OPTIONS(LEVEL, SIZE)       \
159   do                                            \
160     {                                           \
161       if (LEVEL >= 1)                           \
162         flag_regmove = TRUE;                    \
163                                                 \
164       if (SIZE || LEVEL > 1)                    \
165         {                                       \
166           flag_omit_frame_pointer = TRUE;       \
167         }                                       \
168     }                                           \
169   while (0)
170
171 /* This one will have to wait a little bit; right now we can't debug
172    neither with or without a frame-pointer.  */
173 /* #define CAN_DEBUG_WITHOUT_FP */
174
175
176 /* Node: Per-Function Data */
177 #define INIT_EXPANDERS mmix_init_expanders ()
178
179
180 /* Node: Storage Layout */
181 /* I see no bit-field instructions.  Anyway, the common order is from low
182    to high, as the power of two, hence little-endian.  */
183 #define BITS_BIG_ENDIAN 0
184 #define BYTES_BIG_ENDIAN 1
185 #define WORDS_BIG_ENDIAN 1
186 #define FLOAT_WORDS_BIG_ENDIAN 1
187 #define UNITS_PER_WORD 8
188
189 /* FIXME: Promotion of modes currently generates slow code, extending
190    before every operation.  */
191 /* I'm a little bit undecided about this one.  It might be beneficial to
192    promote all operations.  */
193
194 #define PROMOTE_FUNCTION_MODE(MODE, UNSIGNEDP, TYPE)    \
195  do {                                           \
196   if (GET_MODE_CLASS (MODE) == MODE_INT         \
197       && GET_MODE_SIZE (MODE) < 8)              \
198    {                                            \
199      (MODE) = DImode;                           \
200      /* Do the following some time later,       \
201         scrutinizing differences.  */           \
202      if (0) (UNSIGNEDP) = 0;                    \
203    }                                            \
204  } while (0)
205
206 /* We need to align everything to 64 bits that can affect the alignment
207    of other types.  Since address N is interpreted in MMIX as (N modulo
208    access_size), we must align.  */
209 #define PARM_BOUNDARY 64
210 #define STACK_BOUNDARY 64
211 #define FUNCTION_BOUNDARY 32
212 #define BIGGEST_ALIGNMENT 64
213
214 /* This one is only used in the ADA front end.  */
215 #define MINIMUM_ATOMIC_ALIGNMENT 8
216
217 /* Copied from elfos.h.  */
218 #define MAX_OFILE_ALIGNMENT (32768 * 8)
219
220 #define DATA_ALIGNMENT(TYPE, BASIC_ALIGN) \
221  mmix_data_alignment (TYPE, BASIC_ALIGN)
222
223 #define CONSTANT_ALIGNMENT(CONSTANT, BASIC_ALIGN) \
224  mmix_constant_alignment (CONSTANT, BASIC_ALIGN)
225
226 #define LOCAL_ALIGNMENT(TYPE, BASIC_ALIGN) \
227  mmix_local_alignment (TYPE, BASIC_ALIGN)
228
229 /* Following other ports, this seems to most commonly be the word-size,
230    so let's do that here too.  */
231 #define EMPTY_FIELD_BOUNDARY 64
232
233 /* We chose to have this low solely for similarity with the alpha.  It has
234    nothing to do with passing the tests dg/c99-scope-2 and
235    execute/align-1.c.  Nothing.  Though the tests seem wrong.  Padding of
236    the structure is automatically added to get alignment when needed if we
237    set this to just byte-boundary.  */
238 #define STRUCTURE_SIZE_BOUNDARY 8
239
240 /* The lower bits are ignored.  */
241 #define STRICT_ALIGNMENT 1
242
243
244 /* Node: Type Layout */
245
246 /* It might seem more natural to have 64-bit ints on a 64-bit machine,
247    but then an occasional MMIX programmer needs to know how to put a lot
248    of __attribute__ stuff to get to the 8, 16 and 32-bit modes rather
249    than the "intuitive" char, short and int types.  */
250 #define INT_TYPE_SIZE 32
251 #define SHORT_TYPE_SIZE 16
252 #define LONG_LONG_TYPE_SIZE 64
253
254 #define FLOAT_TYPE_SIZE 32
255 #define DOUBLE_TYPE_SIZE 64
256 #define LONG_DOUBLE_TYPE_SIZE 64
257
258 #define DEFAULT_SIGNED_CHAR 1
259
260
261 /* Node: Register Basics */
262 /* We tell GCC about all 256 general registers, and we also include
263    rD, rE, rH, rJ, rR and rO (in that order) so we can describe what insns
264    clobber them.  We use a faked register for the argument pointer.  It is
265    always eliminated towards the frame-pointer or the stack-pointer, never
266    output in assembly.  Any fixed register would do for this, like $255,
267    but future debugging is easier when using a separate register.  It
268    counts as a global register for pseudorandom reasons.  */
269 #define FIRST_PSEUDO_REGISTER 263
270
271 /* We treat general registers with no assigned purpose as fixed.  The
272    stack pointer, $254, is also fixed.  Register $255 is referred to as a
273    temporary register in the MMIX papers, and used as such in mmixal, so
274    it should not be used as a stack pointer.  We set it to fixed, and use
275    it "manually" at times of despair.  */
276 #define FIXED_REGISTERS \
277  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
278    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
279    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
280    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
281    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
282    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
283    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
284    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
285    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
286    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
287    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
288    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
289    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
290    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
291    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
292    1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, \
293    1, 1, 0, 0, 0, 1, 1 \
294  }
295
296 /* General registers are fixed and therefore "historically" marked
297    call-used.  (FIXME: This has changed).  Registers $15..$31 are
298    call-clobbered; we'll put arguments in $16 and up, and we need $15 for
299    the MMIX register-stack "hole".  */
300 #define CALL_USED_REGISTERS \
301  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \
302    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
303    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
304    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
305    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
306    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
307    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
308    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
309    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
310    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
311    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
312    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
313    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
314    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
315    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
316    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, \
317    1, 1, 1, 1, 1, 1, 1 \
318  }
319
320 #define CONDITIONAL_REGISTER_USAGE mmix_conditional_register_usage ()
321
322 #define INCOMING_REGNO(OUT) mmix_opposite_regno (OUT, 0)
323
324 #define OUTGOING_REGNO(IN) mmix_opposite_regno (IN, 1)
325
326 /* Defining LOCAL_REGNO is necessary in presence of prologue/epilogue,
327    else GCC will be confused that those registers aren't saved and
328    restored.  */
329 #define LOCAL_REGNO(REGNO) mmix_local_regno (REGNO)
330
331 /* Node: Allocation Order */
332
333 /* We should allocate registers from 0 to 31 by increasing number, because
334    I think that's what people expect.  Beyond that, just use
335    call-clobbered global registers first, then call-clobbered special
336    registers.  Last, the fixed registers.  */
337 #define MMIX_MMIXWARE_ABI_REG_ALLOC_ORDER       \
338  { 0, 1, 2, 3, 4, 5, 6, 7,                      \
339    8, 9, 10, 11, 12, 13, 14, 15,                \
340    16, 17, 18, 19, 20, 21, 22, 23,              \
341    24, 25, 26, 27, 28, 29, 30, 31,              \
342                                                 \
343    252, 251, 250, 249, 248, 247,                \
344                                                 \
345    253,                                         \
346                                                 \
347    258, 260, 259,                               \
348                                                 \
349    32, 33, 34, 35, 36, 37, 38, 39,              \
350    40, 41, 42, 43, 44, 45, 46, 47,              \
351    48, 49, 50, 51, 52, 53, 54, 55,              \
352    56, 57, 58, 59, 60, 61, 62, 63,              \
353    64, 65, 66, 67, 68, 69, 70, 71,              \
354    72, 73, 74, 75, 76, 77, 78, 79,              \
355    80, 81, 82, 83, 84, 85, 86, 87,              \
356    88, 89, 90, 91, 92, 93, 94, 95,              \
357    96, 97, 98, 99, 100, 101, 102, 103,          \
358    104, 105, 106, 107, 108, 109, 110, 111,      \
359    112, 113, 114, 115, 116, 117, 118, 119,      \
360    120, 121, 122, 123, 124, 125, 126, 127,      \
361    128, 129, 130, 131, 132, 133, 134, 135,      \
362    136, 137, 138, 139, 140, 141, 142, 143,      \
363    144, 145, 146, 147, 148, 149, 150, 151,      \
364    152, 153, 154, 155, 156, 157, 158, 159,      \
365    160, 161, 162, 163, 164, 165, 166, 167,      \
366    168, 169, 170, 171, 172, 173, 174, 175,      \
367    176, 177, 178, 179, 180, 181, 182, 183,      \
368    184, 185, 186, 187, 188, 189, 190, 191,      \
369    192, 193, 194, 195, 196, 197, 198, 199,      \
370    200, 201, 202, 203, 204, 205, 206, 207,      \
371    208, 209, 210, 211, 212, 213, 214, 215,      \
372    216, 217, 218, 219, 220, 221, 222, 223,      \
373    224, 225, 226, 227, 228, 229, 230, 231,      \
374    232, 233, 234, 235, 236, 237, 238, 239,      \
375    240, 241, 242, 243, 244, 245, 246,           \
376                                                 \
377    254, 255, 256, 257, 261, 262                 \
378  }
379
380 /* As a convenience, we put this nearby, for ease of comparison.
381    First, call-clobbered registers in reverse order of assignment as
382    parameters (also the top ones; not because they're parameters, but
383    for continuity).
384
385    Second, saved registers that go on the register-stack.
386
387    Third, special registers rH, rR and rJ.  They should not normally be
388    allocated, but since they're call-clobbered, it is cheaper to use one
389    of them than using a call-saved register for a call-clobbered use,
390    assuming it is referenced a very limited number of times.  Other global
391    and fixed registers come next; they are never allocated.  */
392 #define MMIX_GNU_ABI_REG_ALLOC_ORDER            \
393  { 252, 251, 250, 249, 248, 247, 246,           \
394    245, 244, 243, 242, 241, 240, 239, 238,      \
395    237, 236, 235, 234, 233, 232, 231,           \
396                                                 \
397    0, 1, 2, 3, 4, 5, 6, 7,                      \
398    8, 9, 10, 11, 12, 13, 14, 15,                \
399    16, 17, 18, 19, 20, 21, 22, 23,              \
400    24, 25, 26, 27, 28, 29, 30, 31,              \
401                                                 \
402    253,                                         \
403                                                 \
404    258, 260, 259,                               \
405                                                 \
406    32, 33, 34, 35, 36, 37, 38, 39,              \
407    40, 41, 42, 43, 44, 45, 46, 47,              \
408    48, 49, 50, 51, 52, 53, 54, 55,              \
409    56, 57, 58, 59, 60, 61, 62, 63,              \
410    64, 65, 66, 67, 68, 69, 70, 71,              \
411    72, 73, 74, 75, 76, 77, 78, 79,              \
412    80, 81, 82, 83, 84, 85, 86, 87,              \
413    88, 89, 90, 91, 92, 93, 94, 95,              \
414    96, 97, 98, 99, 100, 101, 102, 103,          \
415    104, 105, 106, 107, 108, 109, 110, 111,      \
416    112, 113, 114, 115, 116, 117, 118, 119,      \
417    120, 121, 122, 123, 124, 125, 126, 127,      \
418    128, 129, 130, 131, 132, 133, 134, 135,      \
419    136, 137, 138, 139, 140, 141, 142, 143,      \
420    144, 145, 146, 147, 148, 149, 150, 151,      \
421    152, 153, 154, 155, 156, 157, 158, 159,      \
422    160, 161, 162, 163, 164, 165, 166, 167,      \
423    168, 169, 170, 171, 172, 173, 174, 175,      \
424    176, 177, 178, 179, 180, 181, 182, 183,      \
425    184, 185, 186, 187, 188, 189, 190, 191,      \
426    192, 193, 194, 195, 196, 197, 198, 199,      \
427    200, 201, 202, 203, 204, 205, 206, 207,      \
428    208, 209, 210, 211, 212, 213, 214, 215,      \
429    216, 217, 218, 219, 220, 221, 222, 223,      \
430    224, 225, 226, 227, 228, 229, 230,           \
431                                                 \
432    254, 255, 256, 257, 261, 262                 \
433  }
434
435 /* The default one.  */
436 #define REG_ALLOC_ORDER MMIX_MMIXWARE_ABI_REG_ALLOC_ORDER
437
438 /* Node: Values in Registers */
439
440 #define HARD_REGNO_NREGS(REGNO, MODE)                   \
441    ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1)         \
442     / UNITS_PER_WORD)
443
444 #define HARD_REGNO_MODE_OK(REGNO, MODE) 1
445
446 /* Note that no register can really be accessed in single-float mode, so
447    we *can* say 1 here.  FIXME:  Will TRT happen for single-float, or do
448    we have to punt to libgcc1.asm?  */
449 #define MODES_TIEABLE_P(MODE1, MODE2) 1
450
451
452 /* Node: Leaf Functions */
453 /* (empty) */
454
455
456 /* Node: Register Classes */
457
458 enum reg_class
459  {
460    NO_REGS, GENERAL_REGS, REMAINDER_REG, HIMULT_REG,
461    SYSTEM_REGS, ALL_REGS, LIM_REG_CLASSES
462  };
463
464 #define N_REG_CLASSES (int) LIM_REG_CLASSES
465
466 #define REG_CLASS_NAMES                                         \
467  {"NO_REGS", "GENERAL_REGS", "REMAINDER_REG", "HIMULT_REG",     \
468   "SYSTEM_REGS", "ALL_REGS"}
469
470 /* Note that the contents of each item is always 32 bits.  */
471 #define REG_CLASS_CONTENTS                      \
472  {{0, 0, 0, 0, 0, 0, 0, 0, 0},                  \
473   {~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0, 0x20},       \
474   {0, 0, 0, 0, 0, 0, 0, 0, 0x10},               \
475   {0, 0, 0, 0, 0, 0, 0, 0, 4},                  \
476   {0, 0, 0, 0, 0, 0, 0, 0, 0x7f},               \
477   {~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0, 0x7f}}
478
479 #define REGNO_REG_CLASS(REGNO)                                  \
480  ((REGNO) <= MMIX_LAST_GENERAL_REGISTER                         \
481   || (REGNO) == MMIX_ARG_POINTER_REGNUM                         \
482   ? GENERAL_REGS                                                \
483   : (REGNO) == MMIX_REMAINDER_REGNUM ? REMAINDER_REG            \
484   : (REGNO) == MMIX_HIMULT_REGNUM ? HIMULT_REG : SYSTEM_REGS)
485
486 #define BASE_REG_CLASS GENERAL_REGS
487
488 #define INDEX_REG_CLASS GENERAL_REGS
489
490 #define REG_CLASS_FROM_LETTER(CHAR)             \
491  ((CHAR) == 'x' ? SYSTEM_REGS                   \
492   : (CHAR) == 'y' ? REMAINDER_REG               \
493   : (CHAR) == 'z' ? HIMULT_REG : NO_REGS)
494
495 #define REGNO_OK_FOR_BASE_P(REGNO)                              \
496  ((REGNO) <= MMIX_LAST_GENERAL_REGISTER                         \
497   || (REGNO) == MMIX_ARG_POINTER_REGNUM                         \
498   || (reg_renumber[REGNO] > 0                                   \
499       && reg_renumber[REGNO] <= MMIX_LAST_GENERAL_REGISTER))
500
501 #define REGNO_OK_FOR_INDEX_P(REGNO) REGNO_OK_FOR_BASE_P (REGNO)
502
503 #define PREFERRED_RELOAD_CLASS(X, CLASS) \
504  mmix_preferred_reload_class (X, CLASS)
505
506 #define PREFERRED_OUTPUT_RELOAD_CLASS(X, CLASS) \
507  mmix_preferred_output_reload_class (X, CLASS)
508
509 #define SECONDARY_INPUT_RELOAD_CLASS(CLASS, MODE, X) \
510  mmix_secondary_reload_class (CLASS, MODE, X, 1)
511
512 #define SECONDARY_OUTPUT_RELOAD_CLASS(CLASS, MODE, X) \
513  mmix_secondary_reload_class (CLASS, MODE, X, 0)
514
515 #define CLASS_MAX_NREGS(CLASS, MODE) HARD_REGNO_NREGS (CLASS, MODE)
516
517 #define CONST_OK_FOR_LETTER_P(VALUE, C) \
518  mmix_const_ok_for_letter_p (VALUE, C)
519
520 #define EXTRA_CONSTRAINT(VALUE, C)      \
521  mmix_extra_constraint (VALUE, C, MMIX_REG_OK_STRICT)
522
523 /* Do we need anything serious here?  Yes, any FLOT constant.  */
524 #define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C)                  \
525  mmix_const_double_ok_for_letter_p (VALUE, C)
526
527
528 /* Node: Frame Layout */
529
530 #define STACK_GROWS_DOWNWARD
531 #define FRAME_GROWS_DOWNWARD 1
532
533 #define STARTING_FRAME_OFFSET \
534   mmix_starting_frame_offset ()
535
536 #define FIRST_PARM_OFFSET(FUNDECL) 0
537
538 #define DYNAMIC_CHAIN_ADDRESS(FRAMEADDR) \
539  mmix_dynamic_chain_address (FRAMEADDR)
540
541 /* FIXME: It seems RETURN_ADDR_OFFSET is undocumented.  */
542
543 #define SETUP_FRAME_ADDRESSES() \
544  mmix_setup_frame_addresses ()
545
546 #define RETURN_ADDR_RTX(COUNT, FRAME)           \
547  mmix_return_addr_rtx (COUNT, FRAME)
548
549 /* It's in rJ before we store it somewhere.  */
550 #define INCOMING_RETURN_ADDR_RTX \
551  gen_rtx_REG (Pmode, MMIX_INCOMING_RETURN_ADDRESS_REGNUM)
552
553 /* FIXME: This does not seem properly documented or cross-indexed.
554    Nowhere except in the code does it say it *has* to be in the range
555    0..255, or else it will be truncated.  That goes for the default too.  */
556 #define DWARF_FRAME_RETURN_COLUMN \
557  DWARF_FRAME_REGNUM (MMIX_INCOMING_RETURN_ADDRESS_REGNUM)
558
559 /* No return address is stored there.  */
560 #define INCOMING_FRAME_SP_OFFSET 0
561
562 /* Node: Stack Checking */
563 /* (empty) */
564
565
566 /* Node: Exception Handling */
567
568 #define EH_RETURN_DATA_REGNO(N) \
569  mmix_eh_return_data_regno (N)
570
571 #define EH_RETURN_STACKADJ_RTX \
572  mmix_eh_return_stackadj_rtx ()
573
574 #define EH_RETURN_HANDLER_RTX \
575  mmix_eh_return_handler_rtx ()
576
577 #define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \
578  mmix_asm_preferred_eh_data_format (CODE, GLOBAL)
579
580 /* Node: Frame Registers */
581 #define STACK_POINTER_REGNUM MMIX_STACK_POINTER_REGNUM
582
583 /* Perhaps we can use HARD_FRAME_POINTER_REGNUM and decide later on
584    what register we want to use.  */
585 #define FRAME_POINTER_REGNUM MMIX_FRAME_POINTER_REGNUM
586 #define ARG_POINTER_REGNUM MMIX_ARG_POINTER_REGNUM
587
588 #define STATIC_CHAIN_REGNUM MMIX_STATIC_CHAIN_REGNUM
589
590
591 /* Node: Elimination */
592 /* FIXME: Is this requirement built-in?  Anyway, we should try to get rid
593    of it; we can deduce the value.  */
594 #define FRAME_POINTER_REQUIRED  cfun->has_nonlocal_label
595
596 /* The frame-pointer is stored in a location that either counts to the
597    offset of incoming parameters, or that counts to the offset of the
598    frame, so we can't use a single offset.  We therefore eliminate those
599    two separately.  */
600 #define ELIMINABLE_REGS                         \
601  {{ARG_POINTER_REGNUM, STACK_POINTER_REGNUM},   \
602   {ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM},   \
603   {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}}
604
605 /* We need not worry about when the frame-pointer is required for other
606    reasons; GCC takes care of those cases.  */
607 #define CAN_ELIMINATE(FROM, TO) 1
608
609 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
610  (OFFSET) = mmix_initial_elimination_offset (FROM, TO)
611
612
613 /* Node: Stack Arguments */
614
615 #define ACCUMULATE_OUTGOING_ARGS 1
616
617 #define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACKSIZE) 0
618
619
620 /* Node: Register Arguments */
621 #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED)    \
622  mmix_function_arg (&(CUM), MODE, TYPE, NAMED, 0)
623
624 #define FUNCTION_INCOMING_ARG(CUM, MODE, TYPE, NAMED)   \
625  mmix_function_arg (&(CUM), MODE, TYPE, NAMED, 1)
626
627 typedef struct { int regs; int lib; } CUMULATIVE_ARGS;
628
629 #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \
630  ((CUM).regs = 0, (CUM).lib = ((LIBNAME) != 0))
631
632 #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED)            \
633  ((CUM).regs                                                    \
634   = ((targetm.calls.must_pass_in_stack (MODE, TYPE))            \
635      || (MMIX_FUNCTION_ARG_SIZE (MODE, TYPE) > 8                \
636          && !TARGET_LIBFUNC && !(CUM).lib))                     \
637   ? (MMIX_MAX_ARGS_IN_REGS) + 1                                 \
638   : (CUM).regs + (7 + (MMIX_FUNCTION_ARG_SIZE (MODE, TYPE))) / 8)
639
640 #define FUNCTION_ARG_REGNO_P(REGNO)             \
641  mmix_function_arg_regno_p (REGNO, 0)
642
643
644 /* Node: Register Arguments */
645
646 #define FUNCTION_VALUE(VALTYPE, FUNC)  \
647  gen_rtx_REG (TYPE_MODE (VALTYPE), MMIX_RETURN_VALUE_REGNUM)
648
649 /* This needs to take care of the register hole for complex return values.  */
650 #define FUNCTION_OUTGOING_VALUE(VALTYPE, FUNC)  \
651  mmix_function_outgoing_value (VALTYPE, FUNC)
652
653 #define LIBCALL_VALUE(MODE) \
654  gen_rtx_REG (MODE, MMIX_RETURN_VALUE_REGNUM)
655
656 #define FUNCTION_VALUE_REGNO_P(REGNO) \
657  mmix_function_value_regno_p (REGNO)
658
659
660 /* Node: Caller Saves */
661 /* (empty) */
662
663
664 /* Node: Function Entry */
665
666 /* See mmix.c for TARGET_ASM_FUNCTION_PROLOGUE and
667    TARGET_ASM_FUNCTION_EPILOGUE.  */
668
669 /* We need to say that the epilogue uses the return address, so the
670    initial-value machinery restores it.  FIXME: Some targets
671    conditionalize on "reload_completed &&".  Investigate difference.
672    FIXME: Not needed if nonlocal_goto_stack_level.  */
673 #define EPILOGUE_USES(REGNO) \
674  ((REGNO) == MMIX_INCOMING_RETURN_ADDRESS_REGNUM)
675
676 /* Node: Profiling */
677 #define FUNCTION_PROFILER(FILE, LABELNO)        \
678  mmix_function_profiler (FILE, LABELNO)
679
680 /* Node: Trampolines */
681
682 #define TRAMPOLINE_TEMPLATE(FILE) \
683  mmix_trampoline_template (FILE)
684
685 #define TRAMPOLINE_SIZE mmix_trampoline_size
686 #define INITIALIZE_TRAMPOLINE(ADDR, FNADDR, STATIC_CHAIN) \
687  mmix_initialize_trampoline (ADDR, FNADDR, STATIC_CHAIN)
688
689
690 /* Node: Addressing Modes */
691
692 #define CONSTANT_ADDRESS_P(X) \
693  mmix_constant_address_p (X)
694
695 #define MAX_REGS_PER_ADDRESS 2
696
697 #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, LABEL)                \
698  if (mmix_legitimate_address (MODE, X, MMIX_REG_OK_STRICT))     \
699    goto LABEL
700
701 #ifndef REG_OK_STRICT
702 # define REG_OK_FOR_BASE_P(X)                   \
703   (REGNO (X) <= MMIX_LAST_GENERAL_REGISTER      \
704    || REGNO (X) == MMIX_ARG_POINTER_REGNUM      \
705    || REGNO (X) >= FIRST_PSEUDO_REGISTER)
706 #else
707 # define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X))
708 #endif /* REG_OK_STRICT */
709
710 #define REG_OK_FOR_INDEX_P(X) REG_OK_FOR_BASE_P (X)
711
712 #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)
713
714 #define LEGITIMATE_CONSTANT_P(X) \
715  mmix_legitimate_constant_p (X)
716
717
718 /* Node: Condition Code */
719
720 #define SELECT_CC_MODE(OP, X, Y)                \
721  mmix_select_cc_mode (OP, X, Y)
722
723 /* A definition of CANONICALIZE_COMPARISON that changed LE and GT
724    comparisons with -1 to LT and GE respectively, and LT, LTU, GE or GEU
725    comparisons with 256 to 255 and LE, LEU, GT and GTU has been
726    ineffective; the code path for performing the changes did not trig for
727    neither the GCC testsuite nor ghostscript-6.52 nor Knuth's mmix.tar.gz
728    itself (core GCC functionality supposedly handling it) with sources
729    from 2002-06-06.  */
730
731 #define REVERSIBLE_CC_MODE(MODE)                \
732  mmix_reversible_cc_mode (MODE)
733
734
735 /* Node: Costs */
736
737 /* The special registers can only move to and from general regs, and we
738    need to check that their constraints match, so say 3 for them.  */
739 /* WARNING: gcc-2.7.2.2 i686-pc-linux-gnulibc1 (as shipped with RH 4.2)
740    miscompiles reload1.c:reload_cse_simplify_set; a call to
741    reload_cse_regno_equal_p is missing when checking if a substitution of
742    a register setting is valid if this is defined to just the expression
743    in mmix_register_move_cost.
744
745    Symptom: a (all?) register setting is optimized away for e.g.
746    "char *p1(char *p) { return p+1; }" and the value of register zero ($0)
747    is returned.
748
749    We can workaround by making this a function call - unknown if this
750    causes dire speed effects.  */
751 #define REGISTER_MOVE_COST(MODE, FROM, TO) \
752  mmix_register_move_cost (MODE, FROM, TO)
753
754 #define SLOW_BYTE_ACCESS 0
755
756
757 /* Node: Sections */
758
759 /* This must be a constant string, since it's used in crtstuff.c.  */
760 #define TEXT_SECTION_ASM_OP \
761  "\t.text ! mmixal:= 9H LOC 8B"
762
763 /* FIXME: Not documented.  */
764 #define DATA_SECTION_ASM_OP \
765  mmix_data_section_asm_op ()
766
767 #define READONLY_DATA_SECTION_ASM_OP    "\t.section\t.rodata"
768
769 /* Node: PIC */
770 /* (empty) */
771
772
773 /* Node: File Framework */
774
775 /* While any other punctuation character but ";" would do, we prefer "%"
776    or "!"; "!" is an unary operator and so will not be mistakenly included
777    in correctly formed expressions.  The hash character adds mass; catches
778    the eye.  We can't have it as a comment char by itself, since it's a
779    hex-number prefix.  */
780 #define ASM_COMMENT_START "!#"
781
782 /* These aren't currently functional.  We just keep them as markers.  */
783 #define ASM_APP_ON "%APP\n"
784 #define ASM_APP_OFF "%NO_APP\n"
785
786 #define ASM_OUTPUT_SOURCE_FILENAME(STREAM, NAME) \
787  mmix_asm_output_source_filename (STREAM, NAME)
788
789 #define OUTPUT_QUOTED_STRING(STREAM, STRING) \
790  mmix_output_quoted_string (STREAM, STRING, strlen (STRING))
791
792 #define TARGET_ASM_NAMED_SECTION default_elf_asm_named_section
793
794 /* Node: Data Output */
795
796 #define ASM_OUTPUT_ASCII(STREAM, PTR, LEN) \
797  mmix_asm_output_ascii (STREAM, PTR, LEN)
798
799 /* Node: Uninitialized Data */
800
801 #define ASM_OUTPUT_ALIGNED_COMMON(ST, N, S, A) \
802  mmix_asm_output_aligned_common (ST, N, S, A)
803
804 #define ASM_OUTPUT_ALIGNED_LOCAL(ST, N, S, A) \
805  mmix_asm_output_aligned_local (ST, N, S, A)
806
807
808 /* Node: Label Output */
809
810 #define ASM_OUTPUT_LABEL(STREAM, NAME) \
811  mmix_asm_output_label (STREAM, NAME)
812
813 #define ASM_OUTPUT_INTERNAL_LABEL(STREAM, NAME) \
814  mmix_asm_output_internal_label (STREAM, NAME)
815
816 #define ASM_DECLARE_REGISTER_GLOBAL(STREAM, DECL, REGNO, NAME) \
817  mmix_asm_declare_register_global (STREAM, DECL, REGNO, NAME)
818
819 #define GLOBAL_ASM_OP "\t.global "
820
821 #define ASM_WEAKEN_LABEL(STREAM, NAME) \
822  mmix_asm_weaken_label (STREAM, NAME)
823
824 #define MAKE_DECL_ONE_ONLY(DECL) \
825  mmix_make_decl_one_only (DECL)
826
827 #define ASM_OUTPUT_LABELREF(STREAM, NAME) \
828  mmix_asm_output_labelref (STREAM, NAME)
829
830 /* We insert a ":" to disambiguate against user symbols like L5.  */
831 #define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \
832  sprintf (LABEL, "*%s:%ld", PREFIX, (long)(NUM))
833
834 /* Insert "::"; these are rarer than internal labels.  FIXME: Make sure no
835    ":" is seen in the object file; we don't really want that mmixal
836    feature visible there.  We don't want the default, which uses a dot;
837    that'd be incompatible with mmixal.  */
838 #define ASM_PN_FORMAT "%s::%lu"
839
840 #define ASM_OUTPUT_DEF(STREAM, NAME, VALUE) \
841  mmix_asm_output_def (STREAM, NAME, VALUE)
842
843 /* Node: Macros for Initialization */
844 /* We're compiling to ELF and linking to MMO; fundamental ELF features
845    that GCC depend on are there.  */
846
847 /* These must be constant strings, since they're used in crtstuff.c.  */
848 #define INIT_SECTION_ASM_OP "\t.section .init,\"ax\" ! mmixal-incompatible"
849
850 #define FINI_SECTION_ASM_OP "\t.section .fini,\"ax\" ! mmixal-incompatible"
851
852 #define OBJECT_FORMAT_ELF
853
854
855 /* Node: Instruction Output */
856
857 /* The non-$ register names must be prefixed with ":", since they're
858    affected by PREFIX.  We provide the non-colon names as additional
859    names.  */
860 #define REGISTER_NAMES                                                  \
861  {"$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",                       \
862   "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",                 \
863   "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",               \
864   "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",               \
865   "$32", "$33", "$34", "$35", "$36", "$37", "$38", "$39",               \
866   "$40", "$41", "$42", "$43", "$44", "$45", "$46", "$47",               \
867   "$48", "$49", "$50", "$51", "$52", "$53", "$54", "$55",               \
868   "$56", "$57", "$58", "$59", "$60", "$61", "$62", "$63",               \
869   "$64", "$65", "$66", "$67", "$68", "$69", "$70", "$71",               \
870   "$72", "$73", "$74", "$75", "$76", "$77", "$78", "$79",               \
871   "$80", "$81", "$82", "$83", "$84", "$85", "$86", "$87",               \
872   "$88", "$89", "$90", "$91", "$92", "$93", "$94", "$95",               \
873   "$96", "$97", "$98", "$99", "$100", "$101", "$102", "$103",           \
874   "$104", "$105", "$106", "$107", "$108", "$109", "$110", "$111",       \
875   "$112", "$113", "$114", "$115", "$116", "$117", "$118", "$119",       \
876   "$120", "$121", "$122", "$123", "$124", "$125", "$126", "$127",       \
877   "$128", "$129", "$130", "$131", "$132", "$133", "$134", "$135",       \
878   "$136", "$137", "$138", "$139", "$140", "$141", "$142", "$143",       \
879   "$144", "$145", "$146", "$147", "$148", "$149", "$150", "$151",       \
880   "$152", "$153", "$154", "$155", "$156", "$157", "$158", "$159",       \
881   "$160", "$161", "$162", "$163", "$164", "$165", "$166", "$167",       \
882   "$168", "$169", "$170", "$171", "$172", "$173", "$174", "$175",       \
883   "$176", "$177", "$178", "$179", "$180", "$181", "$182", "$183",       \
884   "$184", "$185", "$186", "$187", "$188", "$189", "$190", "$191",       \
885   "$192", "$193", "$194", "$195", "$196", "$197", "$198", "$199",       \
886   "$200", "$201", "$202", "$203", "$204", "$205", "$206", "$207",       \
887   "$208", "$209", "$210", "$211", "$212", "$213", "$214", "$215",       \
888   "$216", "$217", "$218", "$219", "$220", "$221", "$222", "$223",       \
889   "$224", "$225", "$226", "$227", "$228", "$229", "$230", "$231",       \
890   "$232", "$233", "$234", "$235", "$236", "$237", "$238", "$239",       \
891   "$240", "$241", "$242", "$243", "$244", "$245", "$246", "$247",       \
892   "$248", "$249", "$250", "$251", "$252", "$253", "$254", "$255",       \
893   ":rD",  ":rE",  ":rH",  ":rJ",  ":rR",  "ap_!BAD!", ":rO"}
894
895 #define ADDITIONAL_REGISTER_NAMES                       \
896  {{"sp", 254}, {":sp", 254}, {"rD", 256}, {"rE", 257},  \
897   {"rH", 258}, {"rJ", MMIX_rJ_REGNUM}, {"rO", MMIX_rO_REGNUM}}
898
899 #define PRINT_OPERAND(STREAM, X, CODE) \
900  mmix_print_operand (STREAM, X, CODE)
901
902 #define PRINT_OPERAND_PUNCT_VALID_P(CODE) \
903  mmix_print_operand_punct_valid_p (CODE)
904
905 #define PRINT_OPERAND_ADDRESS(STREAM, X) \
906  mmix_print_operand_address (STREAM, X)
907
908 #define ASM_OUTPUT_REG_PUSH(STREAM, REGNO) \
909  mmix_asm_output_reg_push (STREAM, REGNO)
910
911 #define ASM_OUTPUT_REG_POP(STREAM, REGNO) \
912  mmix_asm_output_reg_pop (STREAM, REGNO)
913
914
915 /* Node: Dispatch Tables */
916
917 /* We define both types, since SImode is the better, but DImode the only
918    possible for mmixal so that's the one actually used.  */
919 #define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM, BODY, VALUE, REL) \
920  mmix_asm_output_addr_diff_elt (STREAM, BODY, VALUE, REL)
921
922 #define ASM_OUTPUT_ADDR_VEC_ELT(STREAM, VALUE) \
923  mmix_asm_output_addr_vec_elt (STREAM, VALUE)
924
925
926 /* Node: Exception Region Output */
927 /* (empty) */
928
929 /* Node: Alignment Output */
930
931 #define ASM_OUTPUT_SKIP(STREAM, NBYTES) \
932  mmix_asm_output_skip (STREAM, NBYTES)
933
934 #define ASM_OUTPUT_ALIGN(STREAM, POWER) \
935  mmix_asm_output_align (STREAM, POWER)
936
937
938 /* Node: All Debuggers */
939
940 #define DBX_REGISTER_NUMBER(REGNO) \
941  mmix_dbx_register_number (REGNO)
942
943
944 /* Node: DBX Options */
945 /* (empty) */
946 /* Node: DBX Hooks */
947 /* (empty) */
948 /* Node: File Names and DBX */
949 /* (empty) */
950
951
952 /* Node: SDB and DWARF */
953 #define DWARF2_DEBUGGING_INFO 1
954 #define DWARF2_ASM_LINE_DEBUG_INFO 1
955
956 /* Node: Misc */
957
958 /* There's no way to get a PC-relative offset into tables for SImode, so
959    for the moment we have absolute entries in DImode.
960    When we're going ELF, these should be SImode and 1.  */
961 #define CASE_VECTOR_MODE DImode
962 #define CASE_VECTOR_PC_RELATIVE 0
963
964 #define WORD_REGISTER_OPERATIONS
965
966 /* We have a choice, which makes this yet another parameter to tweak.  The
967    gut feeling is currently that SIGN_EXTEND wins; "int" is more frequent
968    than "unsigned int", and we have signed characters.  FIXME: measure.  */
969 #define LOAD_EXTEND_OP(MODE) (TARGET_ZERO_EXTEND ? ZERO_EXTEND : SIGN_EXTEND)
970
971 #define MOVE_MAX 8
972
973 #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
974
975 /* ??? MMIX allows a choice of STORE_FLAG_VALUE.  Revisit later,
976    we don't have scc expanders yet.  */
977
978 #define Pmode DImode
979
980 #define FUNCTION_MODE QImode
981
982 #define NO_IMPLICIT_EXTERN_C
983
984 #define HANDLE_SYSV_PRAGMA 1
985
986 /* These are checked.  */
987 #define DOLLARS_IN_IDENTIFIERS 0
988 #define NO_DOLLAR_IN_LABEL
989 #define NO_DOT_IN_LABEL
990
991 #endif /* GCC_MMIX_H */
992 /*
993  * Local variables:
994  * eval: (c-set-style "gnu")
995  * indent-tabs-mode: t
996  * End:
997  */