1  /* Definitions of target machine for GNU compiler, for MMIX.
       2     Copyright (C) 2000-2023 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.cc 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  /* A PUSHJ doesn't cost more than a PUSHGO, so don't needlessly create
     581     the latter.  */
     582  #define NO_FUNCTION_CSE 1
     583  
     584  /* Node: Sections */
     585  
     586  /* This must be a constant string, since it's used in crtstuff.c.  */
     587  #define TEXT_SECTION_ASM_OP \
     588   "\t.text ! mmixal:= 9H LOC 8B"
     589  
     590  /* FIXME: Not documented.  */
     591  #define DATA_SECTION_ASM_OP \
     592   mmix_data_section_asm_op ()
     593  
     594  #define READONLY_DATA_SECTION_ASM_OP	"\t.section\t.rodata"
     595  
     596  /* Node: PIC */
     597  /* (empty) */
     598  
     599  
     600  /* Node: File Framework */
     601  
     602  /* While any other punctuation character but ";" would do, we prefer "%"
     603     or "!"; "!" is an unary operator and so will not be mistakenly included
     604     in correctly formed expressions.  The hash character adds mass; catches
     605     the eye.  We can't have it as a comment char by itself, since it's a
     606     hex-number prefix.  */
     607  #define ASM_COMMENT_START "!#"
     608  
     609  /* These aren't currently functional.  We just keep them as markers.  */
     610  #define ASM_APP_ON "%APP\n"
     611  #define ASM_APP_OFF "%NO_APP\n"
     612  
     613  #define OUTPUT_QUOTED_STRING(STREAM, STRING) \
     614   mmix_output_quoted_string (STREAM, STRING, strlen (STRING))
     615  
     616  #define TARGET_ASM_NAMED_SECTION default_elf_asm_named_section
     617  
     618  /* Node: Data Output */
     619  
     620  #define ASM_OUTPUT_ASCII(STREAM, PTR, LEN) \
     621   mmix_asm_output_ascii (STREAM, PTR, LEN)
     622  
     623  /* Make output more ELF-like, by emitting .hidden for hidden symbols
     624     (which don't really matter for mmix-knuth-mmixware). */
     625  #define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) \
     626   default_elf_asm_output_external (FILE, DECL, NAME)
     627  
     628  /* Node: Uninitialized Data */
     629  
     630  #define ASM_OUTPUT_ALIGNED_COMMON(ST, N, S, A) \
     631   mmix_asm_output_aligned_common (ST, N, S, A)
     632  
     633  #define ASM_OUTPUT_ALIGNED_LOCAL(ST, N, S, A) \
     634   mmix_asm_output_aligned_local (ST, N, S, A)
     635  
     636  
     637  /* Node: Label Output */
     638  
     639  #define ASM_OUTPUT_LABEL(STREAM, NAME) \
     640   mmix_asm_output_label (STREAM, NAME)
     641  
     642  #define ASM_OUTPUT_INTERNAL_LABEL(STREAM, NAME) \
     643   mmix_asm_output_internal_label (STREAM, NAME)
     644  
     645  #define ASM_DECLARE_REGISTER_GLOBAL(STREAM, DECL, REGNO, NAME) \
     646   mmix_asm_declare_register_global (STREAM, DECL, REGNO, NAME)
     647  
     648  #define GLOBAL_ASM_OP "\t.global "
     649  
     650  #define ASM_WEAKEN_LABEL(STREAM, NAME) \
     651   mmix_asm_weaken_label (STREAM, NAME)
     652  
     653  #define MAKE_DECL_ONE_ONLY(DECL) \
     654   mmix_make_decl_one_only (DECL)
     655  
     656  #define ASM_OUTPUT_LABELREF(STREAM, NAME) \
     657   mmix_asm_output_labelref (STREAM, NAME)
     658  
     659  /* We insert a ":" to disambiguate against user symbols like L5.  */
     660  #define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \
     661   sprintf (LABEL, "*%s:%ld", PREFIX, (long)(NUM))
     662  
     663  /* Insert "::"; these are rarer than internal labels.  FIXME: Make sure no
     664     ":" is seen in the object file; we don't really want that mmixal
     665     feature visible there.  We don't want the default, which uses a dot;
     666     that'd be incompatible with mmixal.  */
     667  #define ASM_PN_FORMAT "%s::%lu"
     668  
     669  #define ASM_OUTPUT_DEF(STREAM, NAME, VALUE) \
     670   mmix_asm_output_def (STREAM, NAME, VALUE)
     671  
     672  /* Node: Macros for Initialization */
     673  /* We're compiling to ELF and linking to MMO; fundamental ELF features
     674     that GCC depend on are there.  */
     675  
     676  /* These must be constant strings, since they're used in crtstuff.c.  */
     677  #define INIT_SECTION_ASM_OP "\t.section .init,\"ax\" ! mmixal-incompatible"
     678  
     679  #define FINI_SECTION_ASM_OP "\t.section .fini,\"ax\" ! mmixal-incompatible"
     680  
     681  #define OBJECT_FORMAT_ELF
     682  
     683  
     684  /* Node: Instruction Output */
     685  
     686  /* The non-$ register names must be prefixed with ":", since they're
     687     affected by PREFIX.  We provide the non-colon names as additional
     688     names.  */
     689  #define REGISTER_NAMES							\
     690   {"$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",			\
     691    "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",			\
     692    "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",		\
     693    "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",		\
     694    "$32", "$33", "$34", "$35", "$36", "$37", "$38", "$39",		\
     695    "$40", "$41", "$42", "$43", "$44", "$45", "$46", "$47",		\
     696    "$48", "$49", "$50", "$51", "$52", "$53", "$54", "$55",		\
     697    "$56", "$57", "$58", "$59", "$60", "$61", "$62", "$63",		\
     698    "$64", "$65", "$66", "$67", "$68", "$69", "$70", "$71",		\
     699    "$72", "$73", "$74", "$75", "$76", "$77", "$78", "$79",		\
     700    "$80", "$81", "$82", "$83", "$84", "$85", "$86", "$87",		\
     701    "$88", "$89", "$90", "$91", "$92", "$93", "$94", "$95",		\
     702    "$96", "$97", "$98", "$99", "$100", "$101", "$102", "$103",		\
     703    "$104", "$105", "$106", "$107", "$108", "$109", "$110", "$111",	\
     704    "$112", "$113", "$114", "$115", "$116", "$117", "$118", "$119",	\
     705    "$120", "$121", "$122", "$123", "$124", "$125", "$126", "$127",	\
     706    "$128", "$129", "$130", "$131", "$132", "$133", "$134", "$135",	\
     707    "$136", "$137", "$138", "$139", "$140", "$141", "$142", "$143",	\
     708    "$144", "$145", "$146", "$147", "$148", "$149", "$150", "$151",	\
     709    "$152", "$153", "$154", "$155", "$156", "$157", "$158", "$159",	\
     710    "$160", "$161", "$162", "$163", "$164", "$165", "$166", "$167",	\
     711    "$168", "$169", "$170", "$171", "$172", "$173", "$174", "$175",	\
     712    "$176", "$177", "$178", "$179", "$180", "$181", "$182", "$183",	\
     713    "$184", "$185", "$186", "$187", "$188", "$189", "$190", "$191",	\
     714    "$192", "$193", "$194", "$195", "$196", "$197", "$198", "$199",	\
     715    "$200", "$201", "$202", "$203", "$204", "$205", "$206", "$207",	\
     716    "$208", "$209", "$210", "$211", "$212", "$213", "$214", "$215",	\
     717    "$216", "$217", "$218", "$219", "$220", "$221", "$222", "$223",	\
     718    "$224", "$225", "$226", "$227", "$228", "$229", "$230", "$231",	\
     719    "$232", "$233", "$234", "$235", "$236", "$237", "$238", "$239",	\
     720    "$240", "$241", "$242", "$243", "$244", "$245", "$246", "$247",	\
     721    "$248", "$249", "$250", "$251", "$252", "$253", "$254", "$255",	\
     722    ":rD",  ":rE",  ":rH",  ":rJ",  ":rR",  "ap_!BAD!", ":rO"}
     723  
     724  #define ADDITIONAL_REGISTER_NAMES			\
     725   {{"sp", 254}, {":sp", 254}, {"rD", 256}, {"rE", 257},	\
     726    {"rH", 258}, {"rJ", MMIX_rJ_REGNUM}, {"rO", MMIX_rO_REGNUM}}
     727  
     728  #define ASM_OUTPUT_REG_PUSH(STREAM, REGNO) \
     729   mmix_asm_output_reg_push (STREAM, REGNO)
     730  
     731  #define ASM_OUTPUT_REG_POP(STREAM, REGNO) \
     732   mmix_asm_output_reg_pop (STREAM, REGNO)
     733  
     734  
     735  /* Node: Dispatch Tables */
     736  
     737  /* We define both types, since SImode is the better, but DImode the only
     738     possible for mmixal so that's the one actually used.  */
     739  #define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM, BODY, VALUE, REL) \
     740   mmix_asm_output_addr_diff_elt (STREAM, BODY, VALUE, REL)
     741  
     742  #define ASM_OUTPUT_ADDR_VEC_ELT(STREAM, VALUE) \
     743   mmix_asm_output_addr_vec_elt (STREAM, VALUE)
     744  
     745  
     746  /* Node: Exception Region Output */
     747  /* (empty) */
     748  
     749  /* Node: Alignment Output */
     750  
     751  #define ASM_OUTPUT_SKIP(STREAM, NBYTES) \
     752   mmix_asm_output_skip (STREAM, NBYTES)
     753  
     754  #define ASM_OUTPUT_ALIGN(STREAM, POWER) \
     755   mmix_asm_output_align (STREAM, POWER)
     756  
     757  
     758  /* Node: All Debuggers */
     759  
     760  #define DEBUGGER_REGNO(REGNO) \
     761   mmix_debugger_regno (REGNO)
     762  
     763  /* Node: DWARF */
     764  #define DWARF2_DEBUGGING_INFO 1
     765  #define DWARF2_ASM_LINE_DEBUG_INFO 1
     766  
     767  /* Node: Misc */
     768  
     769  /* There's no way to get a PC-relative offset into tables for SImode, so
     770     for the moment we have absolute entries in DImode.
     771     When we're going ELF, these should be SImode and 1.  */
     772  #define CASE_VECTOR_MODE DImode
     773  #define CASE_VECTOR_PC_RELATIVE 0
     774  
     775  #define WORD_REGISTER_OPERATIONS 1
     776  
     777  /* We have a choice, which makes this yet another parameter to tweak.  The
     778     gut feeling is currently that SIGN_EXTEND wins; "int" is more frequent
     779     than "unsigned int", and we have signed characters.  FIXME: measure.  */
     780  #define LOAD_EXTEND_OP(MODE) (TARGET_ZERO_EXTEND ? ZERO_EXTEND : SIGN_EXTEND)
     781  
     782  #define MOVE_MAX 8
     783  
     784  /* ??? MMIX allows a choice of STORE_FLAG_VALUE.  Revisit later,
     785     we don't have scc expanders yet.  */
     786  
     787  #define Pmode DImode
     788  
     789  #define FUNCTION_MODE QImode
     790  
     791  /* mmix-knuth-mmixware target has no support of C99 runtime */
     792  #undef TARGET_LIBC_HAS_FUNCTION
     793  #define TARGET_LIBC_HAS_FUNCTION no_c99_libc_has_function
     794  
     795  /* These are checked.  */
     796  #define DOLLARS_IN_IDENTIFIERS 0
     797  #define NO_DOLLAR_IN_LABEL
     798  #define NO_DOT_IN_LABEL
     799  
     800  #endif /* GCC_MMIX_H */
     801  /*
     802   * Local variables:
     803   * eval: (c-set-style "gnu")
     804   * indent-tabs-mode: t
     805   * End:
     806   */