1 /* Definitions of target machine for GNU compiler, for MMIX.
2    Copyright (C) 2000-2018 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 #define MMIX_FUNCTION_ARG_SIZE(MODE, TYPE) \
75  ((MODE) != BLKmode ? GET_MODE_SIZE (MODE) : int_size_in_bytes (TYPE))
76 
77 /* Per-function machine data.  This is normally an opaque type just
78    defined and used in the tm.c file, but we need to see the definition in
79    mmix.md too.  */
80 struct GTY(()) machine_function
81  {
82    int has_landing_pad;
83    int highest_saved_stack_register;
84    int in_prologue;
85  };
86 
87 /* For these target macros, there is no generic documentation here.  You
88    should read `Using and Porting GCC' for that.  Only comments specific
89    to the MMIX target are here.
90 
91    There are however references to the specific texinfo node (comments
92    with "Node:"), so there should be little or nothing amiss.  Probably
93    the opposite, since we don't have to care about old littering and
94    soon outdated generic comments.  */
95 
96 /* Node: Driver */
97 
98 /* User symbols are in the same name-space as built-in symbols, but we
99    don't need the built-in symbols, so remove those and instead apply
100    stricter operand checking.  Don't warn when expanding insns.  */
101 #define ASM_SPEC "-no-predefined-syms -x"
102 
103 /* Pass on -mset-program-start=N and -mset-data-start=M to the linker.
104    Provide default program start 0x100 unless -mno-set-program-start.
105    Don't do this if linking relocatably, with -r.  For a final link,
106    produce mmo, unless ELF is requested or when linking relocatably.  */
107 #define LINK_SPEC \
108  "%{mset-program-start=*:--defsym __.MMIX.start..text=%*}\
109   %{mset-data-start=*:--defsym __.MMIX.start..data=%*}\
110   %{!mset-program-start=*:\
111     %{!mno-set-program-start:\
112      %{!r:--defsym __.MMIX.start..text=0x100}}}\
113   %{!melf:%{!r:-m mmo}}%{melf|r:-m elf64mmix}"
114 
115 /* FIXME: There's no provision for profiling here.  */
116 #define STARTFILE_SPEC  \
117   "crti%O%s crtbegin%O%s"
118 
119 #define ENDFILE_SPEC "crtend%O%s crtn%O%s"
120 
121 /* Node: Run-time Target */
122 
123 /* Define __LONG_MAX__, since we're advised not to change glimits.h.  */
124 #define TARGET_CPU_CPP_BUILTINS()				\
125   do								\
126     {								\
127       builtin_define ("__mmix__");				\
128       builtin_define ("__MMIX__");				\
129       if (TARGET_ABI_GNU)					\
130 	builtin_define ("__MMIX_ABI_GNU__");			\
131       else							\
132 	builtin_define ("__MMIX_ABI_MMIXWARE__");		\
133     }								\
134   while (0)
135 
136 #define TARGET_DEFAULT \
137  (MASK_BRANCH_PREDICT | MASK_BASE_ADDRESSES | MASK_USE_RETURN_INSN)
138 
139 
140 /* Node: Per-Function Data */
141 #define INIT_EXPANDERS mmix_init_expanders ()
142 
143 
144 /* Node: Storage Layout */
145 /* I see no bit-field instructions.  Anyway, the common order is from low
146    to high, as the power of two, hence little-endian.  */
147 #define BITS_BIG_ENDIAN 0
148 #define BYTES_BIG_ENDIAN 1
149 #define WORDS_BIG_ENDIAN 1
150 #define FLOAT_WORDS_BIG_ENDIAN 1
151 #define UNITS_PER_WORD 8
152 
153 /* We need to align everything to 64 bits that can affect the alignment
154    of other types.  Since address N is interpreted in MMIX as (N modulo
155    access_size), we must align.  */
156 #define PARM_BOUNDARY 64
157 #define STACK_BOUNDARY 64
158 #define FUNCTION_BOUNDARY 32
159 #define BIGGEST_ALIGNMENT 64
160 
161 /* This one is only used in the ADA front end.  */
162 #define MINIMUM_ATOMIC_ALIGNMENT 8
163 
164 /* Copied from elfos.h.  */
165 #define MAX_OFILE_ALIGNMENT (32768 * 8)
166 
167 #define DATA_ABI_ALIGNMENT(TYPE, BASIC_ALIGN) \
168  mmix_data_alignment (TYPE, BASIC_ALIGN)
169 
170 #define LOCAL_ALIGNMENT(TYPE, BASIC_ALIGN) \
171  mmix_local_alignment (TYPE, BASIC_ALIGN)
172 
173 /* Following other ports, this seems to most commonly be the word-size,
174    so let's do that here too.  */
175 #define EMPTY_FIELD_BOUNDARY 64
176 
177 /* We chose to have this low solely for similarity with the alpha.  It has
178    nothing to do with passing the tests dg/c99-scope-2 and
179    execute/align-1.c.  Nothing.  Though the tests seem wrong.  Padding of
180    the structure is automatically added to get alignment when needed if we
181    set this to just byte-boundary.  */
182 #define STRUCTURE_SIZE_BOUNDARY 8
183 
184 /* The lower bits are ignored.  */
185 #define STRICT_ALIGNMENT 1
186 
187 
188 /* Node: Type Layout */
189 
190 /* It might seem more natural to have 64-bit ints on a 64-bit machine,
191    but then an occasional MMIX programmer needs to know how to put a lot
192    of __attribute__ stuff to get to the 8, 16 and 32-bit modes rather
193    than the "intuitive" char, short and int types.  */
194 #define INT_TYPE_SIZE 32
195 #define SHORT_TYPE_SIZE 16
196 #define LONG_LONG_TYPE_SIZE 64
197 
198 #define FLOAT_TYPE_SIZE 32
199 #define DOUBLE_TYPE_SIZE 64
200 #define LONG_DOUBLE_TYPE_SIZE 64
201 
202 #define DEFAULT_SIGNED_CHAR 1
203 
204 
205 /* Node: Register Basics */
206 /* We tell GCC about all 256 general registers, and we also include
207    rD, rE, rH, rJ, rR and rO (in that order) so we can describe what insns
208    clobber them.  We use a faked register for the argument pointer.  It is
209    always eliminated towards the frame-pointer or the stack-pointer, never
210    output in assembly.  Any fixed register would do for this, like $255,
211    but future debugging is easier when using a separate register.  It
212    counts as a global register for pseudorandom reasons.  */
213 #define FIRST_PSEUDO_REGISTER 263
214 
215 /* We treat general registers with no assigned purpose as fixed.  The
216    stack pointer, $254, is also fixed.  Register $255 is referred to as a
217    temporary register in the MMIX papers, and used as such in mmixal, so
218    it should not be used as a stack pointer.  We set it to fixed, and use
219    it "manually" at times of despair.  */
220 #define FIXED_REGISTERS \
221  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
222    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
223    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
224    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
225    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
226    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
227    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
228    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
229    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
230    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
231    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
232    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
233    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
234    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
235    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
236    1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, \
237    1, 1, 0, 0, 0, 1, 1 \
238  }
239 
240 /* General registers are fixed and therefore "historically" marked
241    call-used.  (FIXME: This has changed).  Registers $15..$31 are
242    call-clobbered; we'll put arguments in $16 and up, and we need $15 for
243    the MMIX register-stack "hole".  */
244 #define CALL_USED_REGISTERS \
245  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \
246    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
247    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
248    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
249    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
250    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
251    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
252    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
253    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
254    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
255    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
256    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
257    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
258    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
259    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
260    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, \
261    1, 1, 1, 1, 1, 1, 1 \
262  }
263 
264 #define INCOMING_REGNO(OUT) mmix_opposite_regno (OUT, 0)
265 
266 #define OUTGOING_REGNO(IN) mmix_opposite_regno (IN, 1)
267 
268 /* Defining LOCAL_REGNO is necessary in presence of prologue/epilogue,
269    else GCC will be confused that those registers aren't saved and
270    restored.  */
271 #define LOCAL_REGNO(REGNO) mmix_local_regno (REGNO)
272 
273 /* Node: Allocation Order */
274 
275 /* We should allocate registers from 0 to 31 by increasing number, because
276    I think that's what people expect.  Beyond that, just use
277    call-clobbered global registers first, then call-clobbered special
278    registers.  Last, the fixed registers.  */
279 #define MMIX_MMIXWARE_ABI_REG_ALLOC_ORDER	\
280  { 0, 1, 2, 3, 4, 5, 6, 7,			\
281    8, 9, 10, 11, 12, 13, 14, 15,		\
282    16, 17, 18, 19, 20, 21, 22, 23,		\
283    24, 25, 26, 27, 28, 29, 30, 31,    		\
284 						\
285    252, 251, 250, 249, 248, 247, 		\
286 						\
287    253,						\
288 						\
289    258, 260, 259,				\
290 						\
291    32, 33, 34, 35, 36, 37, 38, 39,		\
292    40, 41, 42, 43, 44, 45, 46, 47,		\
293    48, 49, 50, 51, 52, 53, 54, 55,		\
294    56, 57, 58, 59, 60, 61, 62, 63,		\
295    64, 65, 66, 67, 68, 69, 70, 71,		\
296    72, 73, 74, 75, 76, 77, 78, 79,		\
297    80, 81, 82, 83, 84, 85, 86, 87,		\
298    88, 89, 90, 91, 92, 93, 94, 95,		\
299    96, 97, 98, 99, 100, 101, 102, 103,		\
300    104, 105, 106, 107, 108, 109, 110, 111,	\
301    112, 113, 114, 115, 116, 117, 118, 119,	\
302    120, 121, 122, 123, 124, 125, 126, 127,	\
303    128, 129, 130, 131, 132, 133, 134, 135,	\
304    136, 137, 138, 139, 140, 141, 142, 143,	\
305    144, 145, 146, 147, 148, 149, 150, 151,	\
306    152, 153, 154, 155, 156, 157, 158, 159,	\
307    160, 161, 162, 163, 164, 165, 166, 167,	\
308    168, 169, 170, 171, 172, 173, 174, 175,	\
309    176, 177, 178, 179, 180, 181, 182, 183,	\
310    184, 185, 186, 187, 188, 189, 190, 191,	\
311    192, 193, 194, 195, 196, 197, 198, 199,	\
312    200, 201, 202, 203, 204, 205, 206, 207,	\
313    208, 209, 210, 211, 212, 213, 214, 215,	\
314    216, 217, 218, 219, 220, 221, 222, 223,	\
315    224, 225, 226, 227, 228, 229, 230, 231,	\
316    232, 233, 234, 235, 236, 237, 238, 239,	\
317    240, 241, 242, 243, 244, 245, 246,		\
318 						\
319    254, 255, 256, 257, 261, 262			\
320  }
321 
322 /* As a convenience, we put this nearby, for ease of comparison.
323    First, call-clobbered registers in reverse order of assignment as
324    parameters (also the top ones; not because they're parameters, but
325    for continuity).
326 
327    Second, saved registers that go on the register-stack.
328 
329    Third, special registers rH, rR and rJ.  They should not normally be
330    allocated, but since they're call-clobbered, it is cheaper to use one
331    of them than using a call-saved register for a call-clobbered use,
332    assuming it is referenced a very limited number of times.  Other global
333    and fixed registers come next; they are never allocated.  */
334 #define MMIX_GNU_ABI_REG_ALLOC_ORDER		\
335  { 252, 251, 250, 249, 248, 247, 246,		\
336    245, 244, 243, 242, 241, 240, 239, 238,	\
337    237, 236, 235, 234, 233, 232, 231,		\
338 						\
339    0, 1, 2, 3, 4, 5, 6, 7,			\
340    8, 9, 10, 11, 12, 13, 14, 15,		\
341    16, 17, 18, 19, 20, 21, 22, 23,		\
342    24, 25, 26, 27, 28, 29, 30, 31,		\
343 						\
344    253,						\
345 						\
346    258, 260, 259,				\
347 						\
348    32, 33, 34, 35, 36, 37, 38, 39,		\
349    40, 41, 42, 43, 44, 45, 46, 47,		\
350    48, 49, 50, 51, 52, 53, 54, 55,		\
351    56, 57, 58, 59, 60, 61, 62, 63,		\
352    64, 65, 66, 67, 68, 69, 70, 71,		\
353    72, 73, 74, 75, 76, 77, 78, 79,		\
354    80, 81, 82, 83, 84, 85, 86, 87,		\
355    88, 89, 90, 91, 92, 93, 94, 95,		\
356    96, 97, 98, 99, 100, 101, 102, 103,		\
357    104, 105, 106, 107, 108, 109, 110, 111,	\
358    112, 113, 114, 115, 116, 117, 118, 119,	\
359    120, 121, 122, 123, 124, 125, 126, 127,	\
360    128, 129, 130, 131, 132, 133, 134, 135,	\
361    136, 137, 138, 139, 140, 141, 142, 143,	\
362    144, 145, 146, 147, 148, 149, 150, 151,	\
363    152, 153, 154, 155, 156, 157, 158, 159,	\
364    160, 161, 162, 163, 164, 165, 166, 167,	\
365    168, 169, 170, 171, 172, 173, 174, 175,	\
366    176, 177, 178, 179, 180, 181, 182, 183,	\
367    184, 185, 186, 187, 188, 189, 190, 191,	\
368    192, 193, 194, 195, 196, 197, 198, 199,	\
369    200, 201, 202, 203, 204, 205, 206, 207,	\
370    208, 209, 210, 211, 212, 213, 214, 215,	\
371    216, 217, 218, 219, 220, 221, 222, 223,	\
372    224, 225, 226, 227, 228, 229, 230,		\
373 						\
374    254, 255, 256, 257, 261, 262			\
375  }
376 
377 /* The default one.  */
378 #define REG_ALLOC_ORDER MMIX_MMIXWARE_ABI_REG_ALLOC_ORDER
379 
380 /* Node: Leaf Functions */
381 /* (empty) */
382 
383 
384 /* Node: Register Classes */
385 
386 enum reg_class
387  {
388    NO_REGS, GENERAL_REGS, REMAINDER_REG, HIMULT_REG,
389    SYSTEM_REGS, ALL_REGS, LIM_REG_CLASSES
390  };
391 
392 #define N_REG_CLASSES (int) LIM_REG_CLASSES
393 
394 #define REG_CLASS_NAMES						\
395  {"NO_REGS", "GENERAL_REGS", "REMAINDER_REG", "HIMULT_REG",	\
396   "SYSTEM_REGS", "ALL_REGS"}
397 
398 /* Note that the contents of each item is always 32 bits.  */
399 #define REG_CLASS_CONTENTS			\
400  {{0, 0, 0, 0, 0, 0, 0, 0, 0},			\
401   {~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0, 0x20},	\
402   {0, 0, 0, 0, 0, 0, 0, 0, 0x10},		\
403   {0, 0, 0, 0, 0, 0, 0, 0, 4},			\
404   {0, 0, 0, 0, 0, 0, 0, 0, 0x7f},		\
405   {~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0, 0x7f}}
406 
407 #define REGNO_REG_CLASS(REGNO)					\
408  ((REGNO) <= MMIX_LAST_GENERAL_REGISTER				\
409   || (REGNO) == MMIX_ARG_POINTER_REGNUM				\
410   ? GENERAL_REGS						\
411   : (REGNO) == MMIX_REMAINDER_REGNUM ? REMAINDER_REG		\
412   : (REGNO) == MMIX_HIMULT_REGNUM ? HIMULT_REG : SYSTEM_REGS)
413 
414 #define BASE_REG_CLASS GENERAL_REGS
415 
416 #define INDEX_REG_CLASS GENERAL_REGS
417 
418 #define REGNO_OK_FOR_BASE_P(REGNO)				\
419  ((REGNO) <= MMIX_LAST_GENERAL_REGISTER				\
420   || (REGNO) == MMIX_ARG_POINTER_REGNUM				\
421   || (reg_renumber[REGNO] > 0					\
422       && reg_renumber[REGNO] <= MMIX_LAST_GENERAL_REGISTER))
423 
424 #define REGNO_OK_FOR_INDEX_P(REGNO) REGNO_OK_FOR_BASE_P (REGNO)
425 
426 #define SECONDARY_INPUT_RELOAD_CLASS(CLASS, MODE, X) \
427  mmix_secondary_reload_class (CLASS, MODE, X, 1)
428 
429 #define SECONDARY_OUTPUT_RELOAD_CLASS(CLASS, MODE, X) \
430  mmix_secondary_reload_class (CLASS, MODE, X, 0)
431 
432 #define CLASS_MAX_NREGS(CLASS, MODE) targetm.hard_regno_nregs (CLASS, MODE)
433 
434 
435 /* Node: Frame Layout */
436 
437 #define STACK_GROWS_DOWNWARD 1
438 #define FRAME_GROWS_DOWNWARD 1
439 
440 #define FIRST_PARM_OFFSET(FUNDECL) 0
441 
442 #define DYNAMIC_CHAIN_ADDRESS(FRAMEADDR) \
443  mmix_dynamic_chain_address (FRAMEADDR)
444 
445 /* FIXME: It seems RETURN_ADDR_OFFSET is undocumented.  */
446 
447 #define SETUP_FRAME_ADDRESSES() \
448  mmix_setup_frame_addresses ()
449 
450 #define RETURN_ADDR_RTX(COUNT, FRAME)		\
451  mmix_return_addr_rtx (COUNT, FRAME)
452 
453 /* It's in rJ before we store it somewhere.  */
454 #define INCOMING_RETURN_ADDR_RTX \
455  gen_rtx_REG (Pmode, MMIX_INCOMING_RETURN_ADDRESS_REGNUM)
456 
457 /* FIXME: This does not seem properly documented or cross-indexed.
458    Nowhere except in the code does it say it *has* to be in the range
459    0..255, or else it will be truncated.  That goes for the default too.  */
460 #define DWARF_FRAME_RETURN_COLUMN \
461  DWARF_FRAME_REGNUM (MMIX_INCOMING_RETURN_ADDRESS_REGNUM)
462 
463 /* No return address is stored there.  */
464 #define INCOMING_FRAME_SP_OFFSET 0
465 
466 /* Node: Stack Checking */
467 /* (empty) */
468 
469 
470 /* Node: Exception Handling */
471 
472 #define EH_RETURN_DATA_REGNO(N) \
473  mmix_eh_return_data_regno (N)
474 
475 #define EH_RETURN_STACKADJ_RTX \
476  mmix_eh_return_stackadj_rtx ()
477 
478 #define EH_RETURN_HANDLER_RTX \
479  mmix_eh_return_handler_rtx ()
480 
481 #define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \
482  mmix_asm_preferred_eh_data_format (CODE, GLOBAL)
483 
484 /* Node: Frame Registers */
485 #define STACK_POINTER_REGNUM MMIX_STACK_POINTER_REGNUM
486 
487 /* Perhaps we can use HARD_FRAME_POINTER_REGNUM and decide later on
488    what register we want to use.  */
489 #define FRAME_POINTER_REGNUM MMIX_FRAME_POINTER_REGNUM
490 #define ARG_POINTER_REGNUM MMIX_ARG_POINTER_REGNUM
491 
492 #define STATIC_CHAIN_REGNUM MMIX_STATIC_CHAIN_REGNUM
493 
494 
495 /* Node: Elimination */
496 
497 /* The frame-pointer is stored in a location that either counts to the
498    offset of incoming parameters, or that counts to the offset of the
499    frame, so we can't use a single offset.  We therefore eliminate those
500    two separately.  */
501 #define ELIMINABLE_REGS				\
502  {{ARG_POINTER_REGNUM, STACK_POINTER_REGNUM},	\
503   {ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM},	\
504   {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}}
505 
506 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
507  (OFFSET) = mmix_initial_elimination_offset (FROM, TO)
508 
509 
510 /* Node: Stack Arguments */
511 
512 #define ACCUMULATE_OUTGOING_ARGS 1
513 
514 
515 /* Node: Register Arguments */
516 
517 typedef struct { int regs; int lib; } CUMULATIVE_ARGS;
518 
519 #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \
520  ((CUM).regs = 0, (CUM).lib = ((LIBNAME) != 0))
521 
522 #define FUNCTION_ARG_REGNO_P(REGNO)		\
523  mmix_function_arg_regno_p (REGNO, 0)
524 
525 
526 /* Node: Caller Saves */
527 /* (empty) */
528 
529 
530 /* Node: Function Entry */
531 
532 /* See mmix.c for TARGET_ASM_FUNCTION_PROLOGUE and
533    TARGET_ASM_FUNCTION_EPILOGUE.  */
534 
535 /* We need to say that the epilogue uses the return address, so the
536    initial-value machinery restores it.  FIXME: Some targets
537    conditionalize on "reload_completed &&".  Investigate difference.
538    FIXME: Not needed if nonlocal_goto_stack_level.  */
539 #define EPILOGUE_USES(REGNO) \
540  ((REGNO) == MMIX_INCOMING_RETURN_ADDRESS_REGNUM)
541 
542 /* Node: Profiling */
543 #define FUNCTION_PROFILER(FILE, LABELNO)	\
544  mmix_function_profiler (FILE, LABELNO)
545 
546 /* Node: Trampolines */
547 
548 #define TRAMPOLINE_SIZE		(4*UNITS_PER_WORD)
549 #define TRAMPOLINE_ALIGNMENT	BITS_PER_WORD
550 
551 /* Node: Addressing Modes */
552 
553 #define CONSTANT_ADDRESS_P(X) \
554  mmix_constant_address_p (X)
555 
556 #define MAX_REGS_PER_ADDRESS 2
557 
558 
559 /* Node: Condition Code */
560 
561 #define SELECT_CC_MODE(OP, X, Y)		\
562  mmix_select_cc_mode (OP, X, Y)
563 
564 /* A definition of CANONICALIZE_COMPARISON that changed LE and GT
565    comparisons with -1 to LT and GE respectively, and LT, LTU, GE or GEU
566    comparisons with 256 to 255 and LE, LEU, GT and GTU has been
567    ineffective; the code path for performing the changes did not trig for
568    neither the GCC testsuite nor ghostscript-6.52 nor Knuth's mmix.tar.gz
569    itself (core GCC functionality supposedly handling it) with sources
570    from 2002-06-06.  */
571 
572 #define REVERSIBLE_CC_MODE(MODE)		\
573  mmix_reversible_cc_mode (MODE)
574 
575 
576 /* Node: Costs */
577 
578 #define SLOW_BYTE_ACCESS 0
579 
580 
581 /* Node: Sections */
582 
583 /* This must be a constant string, since it's used in crtstuff.c.  */
584 #define TEXT_SECTION_ASM_OP \
585  "\t.text ! mmixal:= 9H LOC 8B"
586 
587 /* FIXME: Not documented.  */
588 #define DATA_SECTION_ASM_OP \
589  mmix_data_section_asm_op ()
590 
591 #define READONLY_DATA_SECTION_ASM_OP	"\t.section\t.rodata"
592 
593 /* Node: PIC */
594 /* (empty) */
595 
596 
597 /* Node: File Framework */
598 
599 /* While any other punctuation character but ";" would do, we prefer "%"
600    or "!"; "!" is an unary operator and so will not be mistakenly included
601    in correctly formed expressions.  The hash character adds mass; catches
602    the eye.  We can't have it as a comment char by itself, since it's a
603    hex-number prefix.  */
604 #define ASM_COMMENT_START "!#"
605 
606 /* These aren't currently functional.  We just keep them as markers.  */
607 #define ASM_APP_ON "%APP\n"
608 #define ASM_APP_OFF "%NO_APP\n"
609 
610 #define OUTPUT_QUOTED_STRING(STREAM, STRING) \
611  mmix_output_quoted_string (STREAM, STRING, strlen (STRING))
612 
613 #define TARGET_ASM_NAMED_SECTION default_elf_asm_named_section
614 
615 /* Node: Data Output */
616 
617 #define ASM_OUTPUT_ASCII(STREAM, PTR, LEN) \
618  mmix_asm_output_ascii (STREAM, PTR, LEN)
619 
620 /* Node: Uninitialized Data */
621 
622 #define ASM_OUTPUT_ALIGNED_COMMON(ST, N, S, A) \
623  mmix_asm_output_aligned_common (ST, N, S, A)
624 
625 #define ASM_OUTPUT_ALIGNED_LOCAL(ST, N, S, A) \
626  mmix_asm_output_aligned_local (ST, N, S, A)
627 
628 
629 /* Node: Label Output */
630 
631 #define ASM_OUTPUT_LABEL(STREAM, NAME) \
632  mmix_asm_output_label (STREAM, NAME)
633 
634 #define ASM_OUTPUT_INTERNAL_LABEL(STREAM, NAME) \
635  mmix_asm_output_internal_label (STREAM, NAME)
636 
637 #define ASM_DECLARE_REGISTER_GLOBAL(STREAM, DECL, REGNO, NAME) \
638  mmix_asm_declare_register_global (STREAM, DECL, REGNO, NAME)
639 
640 #define GLOBAL_ASM_OP "\t.global "
641 
642 #define ASM_WEAKEN_LABEL(STREAM, NAME) \
643  mmix_asm_weaken_label (STREAM, NAME)
644 
645 #define MAKE_DECL_ONE_ONLY(DECL) \
646  mmix_make_decl_one_only (DECL)
647 
648 #define ASM_OUTPUT_LABELREF(STREAM, NAME) \
649  mmix_asm_output_labelref (STREAM, NAME)
650 
651 /* We insert a ":" to disambiguate against user symbols like L5.  */
652 #define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \
653  sprintf (LABEL, "*%s:%ld", PREFIX, (long)(NUM))
654 
655 /* Insert "::"; these are rarer than internal labels.  FIXME: Make sure no
656    ":" is seen in the object file; we don't really want that mmixal
657    feature visible there.  We don't want the default, which uses a dot;
658    that'd be incompatible with mmixal.  */
659 #define ASM_PN_FORMAT "%s::%lu"
660 
661 #define ASM_OUTPUT_DEF(STREAM, NAME, VALUE) \
662  mmix_asm_output_def (STREAM, NAME, VALUE)
663 
664 /* Node: Macros for Initialization */
665 /* We're compiling to ELF and linking to MMO; fundamental ELF features
666    that GCC depend on are there.  */
667 
668 /* These must be constant strings, since they're used in crtstuff.c.  */
669 #define INIT_SECTION_ASM_OP "\t.section .init,\"ax\" ! mmixal-incompatible"
670 
671 #define FINI_SECTION_ASM_OP "\t.section .fini,\"ax\" ! mmixal-incompatible"
672 
673 #define OBJECT_FORMAT_ELF
674 
675 
676 /* Node: Instruction Output */
677 
678 /* The non-$ register names must be prefixed with ":", since they're
679    affected by PREFIX.  We provide the non-colon names as additional
680    names.  */
681 #define REGISTER_NAMES							\
682  {"$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",			\
683   "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",			\
684   "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",		\
685   "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",		\
686   "$32", "$33", "$34", "$35", "$36", "$37", "$38", "$39",		\
687   "$40", "$41", "$42", "$43", "$44", "$45", "$46", "$47",		\
688   "$48", "$49", "$50", "$51", "$52", "$53", "$54", "$55",		\
689   "$56", "$57", "$58", "$59", "$60", "$61", "$62", "$63",		\
690   "$64", "$65", "$66", "$67", "$68", "$69", "$70", "$71",		\
691   "$72", "$73", "$74", "$75", "$76", "$77", "$78", "$79",		\
692   "$80", "$81", "$82", "$83", "$84", "$85", "$86", "$87",		\
693   "$88", "$89", "$90", "$91", "$92", "$93", "$94", "$95",		\
694   "$96", "$97", "$98", "$99", "$100", "$101", "$102", "$103",		\
695   "$104", "$105", "$106", "$107", "$108", "$109", "$110", "$111",	\
696   "$112", "$113", "$114", "$115", "$116", "$117", "$118", "$119",	\
697   "$120", "$121", "$122", "$123", "$124", "$125", "$126", "$127",	\
698   "$128", "$129", "$130", "$131", "$132", "$133", "$134", "$135",	\
699   "$136", "$137", "$138", "$139", "$140", "$141", "$142", "$143",	\
700   "$144", "$145", "$146", "$147", "$148", "$149", "$150", "$151",	\
701   "$152", "$153", "$154", "$155", "$156", "$157", "$158", "$159",	\
702   "$160", "$161", "$162", "$163", "$164", "$165", "$166", "$167",	\
703   "$168", "$169", "$170", "$171", "$172", "$173", "$174", "$175",	\
704   "$176", "$177", "$178", "$179", "$180", "$181", "$182", "$183",	\
705   "$184", "$185", "$186", "$187", "$188", "$189", "$190", "$191",	\
706   "$192", "$193", "$194", "$195", "$196", "$197", "$198", "$199",	\
707   "$200", "$201", "$202", "$203", "$204", "$205", "$206", "$207",	\
708   "$208", "$209", "$210", "$211", "$212", "$213", "$214", "$215",	\
709   "$216", "$217", "$218", "$219", "$220", "$221", "$222", "$223",	\
710   "$224", "$225", "$226", "$227", "$228", "$229", "$230", "$231",	\
711   "$232", "$233", "$234", "$235", "$236", "$237", "$238", "$239",	\
712   "$240", "$241", "$242", "$243", "$244", "$245", "$246", "$247",	\
713   "$248", "$249", "$250", "$251", "$252", "$253", "$254", "$255",	\
714   ":rD",  ":rE",  ":rH",  ":rJ",  ":rR",  "ap_!BAD!", ":rO"}
715 
716 #define ADDITIONAL_REGISTER_NAMES			\
717  {{"sp", 254}, {":sp", 254}, {"rD", 256}, {"rE", 257},	\
718   {"rH", 258}, {"rJ", MMIX_rJ_REGNUM}, {"rO", MMIX_rO_REGNUM}}
719 
720 #define ASM_OUTPUT_REG_PUSH(STREAM, REGNO) \
721  mmix_asm_output_reg_push (STREAM, REGNO)
722 
723 #define ASM_OUTPUT_REG_POP(STREAM, REGNO) \
724  mmix_asm_output_reg_pop (STREAM, REGNO)
725 
726 
727 /* Node: Dispatch Tables */
728 
729 /* We define both types, since SImode is the better, but DImode the only
730    possible for mmixal so that's the one actually used.  */
731 #define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM, BODY, VALUE, REL) \
732  mmix_asm_output_addr_diff_elt (STREAM, BODY, VALUE, REL)
733 
734 #define ASM_OUTPUT_ADDR_VEC_ELT(STREAM, VALUE) \
735  mmix_asm_output_addr_vec_elt (STREAM, VALUE)
736 
737 
738 /* Node: Exception Region Output */
739 /* (empty) */
740 
741 /* Node: Alignment Output */
742 
743 #define ASM_OUTPUT_SKIP(STREAM, NBYTES) \
744  mmix_asm_output_skip (STREAM, NBYTES)
745 
746 #define ASM_OUTPUT_ALIGN(STREAM, POWER) \
747  mmix_asm_output_align (STREAM, POWER)
748 
749 
750 /* Node: All Debuggers */
751 
752 #define DBX_REGISTER_NUMBER(REGNO) \
753  mmix_dbx_register_number (REGNO)
754 
755 
756 /* Node: DBX Options */
757 /* (empty) */
758 /* Node: DBX Hooks */
759 /* (empty) */
760 /* Node: File Names and DBX */
761 /* (empty) */
762 
763 
764 /* Node: DWARF */
765 #define DWARF2_DEBUGGING_INFO 1
766 #define DWARF2_ASM_LINE_DEBUG_INFO 1
767 
768 /* Node: Misc */
769 
770 /* There's no way to get a PC-relative offset into tables for SImode, so
771    for the moment we have absolute entries in DImode.
772    When we're going ELF, these should be SImode and 1.  */
773 #define CASE_VECTOR_MODE DImode
774 #define CASE_VECTOR_PC_RELATIVE 0
775 
776 #define WORD_REGISTER_OPERATIONS 1
777 
778 /* We have a choice, which makes this yet another parameter to tweak.  The
779    gut feeling is currently that SIGN_EXTEND wins; "int" is more frequent
780    than "unsigned int", and we have signed characters.  FIXME: measure.  */
781 #define LOAD_EXTEND_OP(MODE) (TARGET_ZERO_EXTEND ? ZERO_EXTEND : SIGN_EXTEND)
782 
783 #define MOVE_MAX 8
784 
785 /* ??? MMIX allows a choice of STORE_FLAG_VALUE.  Revisit later,
786    we don't have scc expanders yet.  */
787 
788 #define Pmode DImode
789 
790 #define FUNCTION_MODE QImode
791 
792 #define NO_IMPLICIT_EXTERN_C
793 
794 /* mmix-knuth-mmixware target has no support of C99 runtime */
795 #undef TARGET_LIBC_HAS_FUNCTION
796 #define TARGET_LIBC_HAS_FUNCTION no_c99_libc_has_function
797 
798 /* These are checked.  */
799 #define DOLLARS_IN_IDENTIFIERS 0
800 #define NO_DOLLAR_IN_LABEL
801 #define NO_DOT_IN_LABEL
802 
803 #endif /* GCC_MMIX_H */
804 /*
805  * Local variables:
806  * eval: (c-set-style "gnu")
807  * indent-tabs-mode: t
808  * End:
809  */
810