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