/* Target macros for the FRV port of GCC.
   Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
   Free Software Foundation, Inc.
   Contributed by Red Hat Inc.

   This file is part of GCC.

   GCC is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published
   by the Free Software Foundation; either version 2, or (at your
   option) any later version.

   GCC is distributed in the hope that it will be useful, but WITHOUT
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
   License for more details.

   You should have received a copy of the GNU General Public License
   along with GCC; see the file COPYING.  If not, write to the Free
   Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.  */

#ifndef __FRV_H__
#define __FRV_H__

/* Frv general purpose macros.  */
/* Align an address.  */
#define ADDR_ALIGN(addr,align) (((addr) + (align) - 1) & ~((align) - 1))

/* Return true if a value is inside a range.  */
#define IN_RANGE_P(VALUE, LOW, HIGH)				\
  (   (((HOST_WIDE_INT)(VALUE)) >= (HOST_WIDE_INT)(LOW))	\
   && (((HOST_WIDE_INT)(VALUE)) <= ((HOST_WIDE_INT)(HIGH))))


/* Driver configuration.  */

/* A C expression which determines whether the option `-CHAR' takes arguments.
   The value should be the number of arguments that option takes-zero, for many
   options.

   By default, this macro is defined to handle the standard options properly.
   You need not define it unless you wish to add additional options which take
   arguments.

   Defined in svr4.h.  */
#undef  SWITCH_TAKES_ARG
#define SWITCH_TAKES_ARG(CHAR)                                          \
  (DEFAULT_SWITCH_TAKES_ARG (CHAR) || (CHAR) == 'G')

/* A C expression which determines whether the option `-NAME' takes arguments.
   The value should be the number of arguments that option takes-zero, for many
   options.  This macro rather than `SWITCH_TAKES_ARG' is used for
   multi-character option names.

   By default, this macro is defined as `DEFAULT_WORD_SWITCH_TAKES_ARG', which
   handles the standard options properly.  You need not define
   `WORD_SWITCH_TAKES_ARG' unless you wish to add additional options which take
   arguments.  Any redefinition should call `DEFAULT_WORD_SWITCH_TAKES_ARG' and
   then check for additional options.

   Defined in svr4.h.  */
#undef WORD_SWITCH_TAKES_ARG

/* A C string constant that tells the GCC driver program options to pass to
   the assembler.  It can also specify how to translate options you give to GNU
   CC into options for GCC to pass to the assembler.  See the file `sun3.h'
   for an example of this.

   Do not define this macro if it does not need to do anything.

   Defined in svr4.h.  */
#undef  ASM_SPEC
#define ASM_SPEC "\
%{G*} %{v} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} \
%{mtomcat-stats} \
%{!mno-eflags: \
    %{mcpu=*} \
    %{mgpr-*} %{mfpr-*} \
    %{msoft-float} %{mhard-float} \
    %{mdword} %{mno-dword} \
    %{mdouble} %{mno-double} \
    %{mmedia} %{mno-media} \
    %{mmuladd} %{mno-muladd} \
    %{mpack} %{mno-pack} \
    %{fpic|fpie: -mpic} %{fPIC|fPIE: -mPIC} %{mlibrary-pic}}"

/* Another C string constant used much like `LINK_SPEC'.  The difference
   between the two is that `STARTFILE_SPEC' is used at the very beginning of
   the command given to the linker.

   If this macro is not defined, a default is provided that loads the standard
   C startup file from the usual place.  See `gcc.c'.

   Defined in svr4.h.  */
#undef  STARTFILE_SPEC
#define STARTFILE_SPEC "crt0%O%s frvbegin%O%s"

/* Another C string constant used much like `LINK_SPEC'.  The difference
   between the two is that `ENDFILE_SPEC' is used at the very end of the
   command given to the linker.

   Do not define this macro if it does not need to do anything.

   Defined in svr4.h.  */
#undef  ENDFILE_SPEC
#define ENDFILE_SPEC "frvend%O%s"

/* A C string constant that tells the GCC driver program options to pass to
   CPP.  It can also specify how to translate options you give to GCC into
   options for GCC to pass to the CPP.

   Do not define this macro if it does not need to do anything.  */

/* The idea here is to use the -mcpu option to define macros based on the
   processor's features, using the features of the default processor if
   no -mcpu option is given.  These macros can then be overridden by
   other -m options.  */
#define CPP_SPEC "\
%{mcpu=frv: %(cpp_frv)} \
%{mcpu=fr500: %(cpp_fr500)} \
%{mcpu=fr400: %(cpp_fr400)} \
%{mcpu=fr300: %(cpp_simple)} \
%{mcpu=tomcat: %(cpp_fr500)} \
%{mcpu=simple: %(cpp_simple)} \
%{!mcpu*: %(cpp_cpu_default)} \
%{mno-media: -D__FRV_ACC__=0 %{msoft-float: -D__FRV_FPR__=0}} \
%{mhard-float: -D__FRV_HARD_FLOAT__} \
%{msoft-float: -U__FRV_HARD_FLOAT__} \
%{mgpr-32: -U__FRV_GPR__ -D__FRV_GPR__=32} \
%{mgpr-64: -U__FRV_GPR__ -D__FRV_GPR__=64} \
%{mfpr-32: -U__FRV_FPR__ -D__FRV_FPR__=32} \
%{mfpr-64: -U__FRV_FPR__ -D__FRV_FPR__=64} \
%{macc-4: -U__FRV_ACC__ -D__FRV_ACC__=4} \
%{macc-8: -U__FRV_ACC__ -D__FRV_ACC__=8} \
%{mdword: -D__FRV_DWORD__} \
%{mno-dword: -U__FRV_DWORD__} \
%{mno-pack: -U__FRV_VLIW__} \
%{fleading-underscore: -D__FRV_UNDERSCORE__}"

/* CPU defaults.  Each CPU has its own CPP spec that defines the default
   macros for that CPU.  Each CPU also has its own default target mask.

   CPU		GPRs	FPRs	ACCs	FPU	MulAdd  ldd/std  Issue rate
   ---		----    ----    ----    ---	------  -------  ----------
   FRV		64	64	8	double	yes	yes      4
   FR500	64	64	8	single	no	yes      4
   FR400	32	32	4	none	no	yes      2
   Simple	32	0	0	none	no	no       1 */


#define CPP_FRV_SPEC "\
-D__FRV_GPR__=64 \
-D__FRV_FPR__=64 \
-D__FRV_ACC__=8 \
-D__FRV_HARD_FLOAT__ \
-D__FRV_DWORD__ \
-D__FRV_VLIW__=4"

#define CPP_FR500_SPEC "\
-D__FRV_GPR__=64 \
-D__FRV_FPR__=64 \
-D__FRV_ACC__=8 \
-D__FRV_HARD_FLOAT__ \
-D__FRV_DWORD__ \
-D__FRV_VLIW__=4"

#define CPP_FR400_SPEC "\
-D__FRV_GPR__=32 \
-D__FRV_FPR__=32 \
-D__FRV_ACC__=4 \
-D__FRV_DWORD__ \
-D__FRV_VLIW__=2"

#define CPP_SIMPLE_SPEC "\
-D__FRV_GPR__=32 \
-D__FRV_FPR__=0 \
-D__FRV_ACC__=0 \
%{mmedia: -D__FRV_ACC__=8} \
%{mhard-float|mmedia: -D__FRV_FPR__=64}"

#define MASK_DEFAULT_FRV	\
  (MASK_MEDIA			\
   | MASK_DOUBLE		\
   | MASK_MULADD		\
   | MASK_DWORD			\
   | MASK_PACK)

#define MASK_DEFAULT_FR500 \
  (MASK_MEDIA | MASK_DWORD | MASK_PACK)

#define MASK_DEFAULT_FR400	\
  (MASK_GPR_32			\
   | MASK_FPR_32		\
   | MASK_MEDIA			\
   | MASK_ACC_4			\
   | MASK_SOFT_FLOAT		\
   | MASK_DWORD			\
   | MASK_PACK)

#define MASK_DEFAULT_SIMPLE \
  (MASK_GPR_32 | MASK_SOFT_FLOAT)

/* A C string constant that tells the GCC driver program options to pass to
   `cc1'.  It can also specify how to translate options you give to GCC into
   options for GCC to pass to the `cc1'.

   Do not define this macro if it does not need to do anything.  */
/* For ABI compliance, we need to put bss data into the normal data section.  */
#define CC1_SPEC "%{G*}"

/* A C string constant that tells the GCC driver program options to pass to
   the linker.  It can also specify how to translate options you give to GCC
   into options for GCC to pass to the linker.

   Do not define this macro if it does not need to do anything.

   Defined in svr4.h.  */
/* Override the svr4.h version with one that dispenses without the svr4
   shared library options, notably -G.  */
#undef	LINK_SPEC
#define LINK_SPEC "\
%{h*} %{v:-V} \
%{b} %{Wl,*:%*} \
%{static:-dn -Bstatic} \
%{shared:-Bdynamic} \
%{symbolic:-Bsymbolic} \
%{G*} \
%{YP,*} \
%{Qy:} %{!Qn:-Qy}"

/* Another C string constant used much like `LINK_SPEC'.  The difference
   between the two is that `LIB_SPEC' is used at the end of the command given
   to the linker.

   If this macro is not defined, a default is provided that loads the standard
   C library from the usual place.  See `gcc.c'.

   Defined in svr4.h.  */

#undef  LIB_SPEC
#define LIB_SPEC "--start-group -lc -lsim --end-group"

/* This macro defines names of additional specifications to put in the specs
   that can be used in various specifications like CC1_SPEC.  Its definition
   is an initializer with a subgrouping for each command option.

   Each subgrouping contains a string constant, that defines the
   specification name, and a string constant that used by the GCC driver
   program.

   Do not define this macro if it does not need to do anything.  */

#ifndef SUBTARGET_EXTRA_SPECS
#define SUBTARGET_EXTRA_SPECS
#endif

#define EXTRA_SPECS							\
  { "cpp_frv",		CPP_FRV_SPEC },					\
  { "cpp_fr500",	CPP_FR500_SPEC },				\
  { "cpp_fr400",	CPP_FR400_SPEC },				\
  { "cpp_simple",	CPP_SIMPLE_SPEC },				\
  { "cpp_cpu_default",	CPP_CPU_DEFAULT_SPEC },				\
  SUBTARGET_EXTRA_SPECS

#ifndef CPP_CPU_DEFAULT_SPEC
#define CPP_CPU_DEFAULT_SPEC	CPP_FR500_SPEC
#define CPU_TYPE		FRV_CPU_FR500
#endif

/* Allow us to easily change the default for -malloc-cc.  */
#ifndef	DEFAULT_NO_ALLOC_CC
#define MASK_DEFAULT_ALLOC_CC	MASK_ALLOC_CC
#else
#define MASK_DEFAULT_ALLOC_CC	0
#endif

/* Run-time target specifications */

#define TARGET_CPU_CPP_BUILTINS()		\
  do						\
    {						\
      builtin_define ("__frv__");		\
      builtin_assert ("machine=frv");		\
    }						\
  while (0)


/* This declaration should be present.  */
extern int target_flags;

/* This series of macros is to allow compiler command arguments to enable or
   disable the use of optional features of the target machine.  For example,
   one machine description serves both the 68000 and the 68020; a command
   argument tells the compiler whether it should use 68020-only instructions or
   not.  This command argument works by means of a macro `TARGET_68020' that
   tests a bit in `target_flags'.

   Define a macro `TARGET_FEATURENAME' for each such option.  Its definition
   should test a bit in `target_flags'; for example:

        #define TARGET_68020 (target_flags & 1)

   One place where these macros are used is in the condition-expressions of
   instruction patterns.  Note how `TARGET_68020' appears frequently in the
   68000 machine description file, `m68k.md'.  Another place they are used is
   in the definitions of the other macros in the `MACHINE.h' file.  */

#define MASK_GPR_32	     0x00000001	/* Limit gprs to 32 registers */
#define MASK_FPR_32	     0x00000002	/* Limit fprs to 32 registers */
#define MASK_SOFT_FLOAT	     0x00000004	/* Use software floating point */
#define MASK_ALLOC_CC	     0x00000008	/* Dynamically allocate icc/fcc's */
#define MASK_DWORD	     0x00000010	/* Change ABi to allow dbl word insns*/
#define MASK_DOUBLE	     0x00000020	/* Use double precision instructions */
#define MASK_MEDIA	     0x00000040	/* Use media instructions */
#define MASK_MULADD	     0x00000080	/* Use multiply add/subtract insns */
#define MASK_LIBPIC	     0x00000100	/* -fpic that can be linked w/o pic */
#define MASK_ACC_4	     0x00000200	/* Only use four media accumulators */
#define MASK_PACK	     0x00000400 /* Set to enable packed output */

			 		/* put debug masks up high */
#define MASK_DEBUG_ARG	     0x40000000	/* debug argument handling */
#define MASK_DEBUG_ADDR	     0x20000000	/* debug go_if_legitimate_address */
#define MASK_DEBUG_STACK     0x10000000	/* debug stack frame */
#define MASK_DEBUG	     0x08000000	/* general debugging switch */
#define MASK_DEBUG_LOC	     0x04000000	/* optimize line # table */
#define MASK_DEBUG_COND_EXEC 0x02000000	/* debug cond exec code */
#define MASK_NO_COND_MOVE    0x01000000	/* disable conditional moves */
#define MASK_NO_SCC	     0x00800000	/* disable set conditional codes */
#define MASK_NO_COND_EXEC    0x00400000	/* disable conditional execution */
#define MASK_NO_VLIW_BRANCH  0x00200000	/* disable repacking branches */
#define MASK_NO_MULTI_CE     0x00100000	/* disable multi-level cond exec */
#define MASK_NO_NESTED_CE    0x00080000	/* disable nested cond exec */

#define MASK_DEFAULT		MASK_DEFAULT_ALLOC_CC

#define TARGET_GPR_32		((target_flags & MASK_GPR_32) != 0)
#define TARGET_FPR_32		((target_flags & MASK_FPR_32) != 0)
#define TARGET_SOFT_FLOAT	((target_flags & MASK_SOFT_FLOAT) != 0)
#define TARGET_ALLOC_CC		((target_flags & MASK_ALLOC_CC) != 0)
#define TARGET_DWORD		((target_flags & MASK_DWORD) != 0)
#define TARGET_DOUBLE		((target_flags & MASK_DOUBLE) != 0)
#define TARGET_MEDIA		((target_flags & MASK_MEDIA) != 0)
#define TARGET_MULADD		((target_flags & MASK_MULADD) != 0)
#define TARGET_LIBPIC		((target_flags & MASK_LIBPIC) != 0)
#define TARGET_ACC_4		((target_flags & MASK_ACC_4) != 0)
#define TARGET_DEBUG_ARG	((target_flags & MASK_DEBUG_ARG) != 0)
#define TARGET_DEBUG_ADDR	((target_flags & MASK_DEBUG_ADDR) != 0)
#define TARGET_DEBUG_STACK	((target_flags & MASK_DEBUG_STACK) != 0)
#define TARGET_DEBUG		((target_flags & MASK_DEBUG) != 0)
#define TARGET_DEBUG_LOC	((target_flags & MASK_DEBUG_LOC) != 0)
#define TARGET_DEBUG_COND_EXEC	((target_flags & MASK_DEBUG_COND_EXEC) != 0)
#define TARGET_NO_COND_MOVE	((target_flags & MASK_NO_COND_MOVE) != 0)
#define TARGET_NO_SCC		((target_flags & MASK_NO_SCC) != 0)
#define TARGET_NO_COND_EXEC	((target_flags & MASK_NO_COND_EXEC) != 0)
#define TARGET_NO_VLIW_BRANCH	((target_flags & MASK_NO_VLIW_BRANCH) != 0)
#define TARGET_NO_MULTI_CE	((target_flags & MASK_NO_MULTI_CE) != 0)
#define TARGET_NO_NESTED_CE	((target_flags & MASK_NO_NESTED_CE) != 0)
#define TARGET_PACK		((target_flags & MASK_PACK) != 0)

#define TARGET_GPR_64		(! TARGET_GPR_32)
#define TARGET_FPR_64		(! TARGET_FPR_32)
#define TARGET_HARD_FLOAT	(! TARGET_SOFT_FLOAT)
#define TARGET_FIXED_CC		(! TARGET_ALLOC_CC)
#define TARGET_COND_MOVE	(! TARGET_NO_COND_MOVE)
#define TARGET_SCC		(! TARGET_NO_SCC)
#define TARGET_COND_EXEC	(! TARGET_NO_COND_EXEC)
#define TARGET_VLIW_BRANCH	(! TARGET_NO_VLIW_BRANCH)
#define TARGET_MULTI_CE		(! TARGET_NO_MULTI_CE)
#define TARGET_NESTED_CE	(! TARGET_NO_NESTED_CE)
#define TARGET_ACC_8		(! TARGET_ACC_4)

#define TARGET_HAS_FPRS		(TARGET_HARD_FLOAT || TARGET_MEDIA)

#define NUM_GPRS		(TARGET_GPR_32? 32 : 64)
#define NUM_FPRS		(!TARGET_HAS_FPRS? 0 : TARGET_FPR_32? 32 : 64)
#define NUM_ACCS		(!TARGET_MEDIA? 0 : TARGET_ACC_4? 4 : 8)

/* Macros to identify the blend of media instructions available.  Revision 1
   is the one found on the FR500.  Revision 2 includes the changes made for
   the FR400.

   Treat the generic processor as a revision 1 machine for now, for
   compatibility with earlier releases.  */

#define TARGET_MEDIA_REV1					\
  (TARGET_MEDIA							\
   && (frv_cpu_type == FRV_CPU_GENERIC				\
       || frv_cpu_type == FRV_CPU_FR500))

#define TARGET_MEDIA_REV2					\
  (TARGET_MEDIA && frv_cpu_type == FRV_CPU_FR400)

/* This macro defines names of command options to set and clear bits in
   `target_flags'.  Its definition is an initializer with a subgrouping for
   each command option.

   Each subgrouping contains a string constant, that defines the option name,
   a number, which contains the bits to set in `target_flags', and an optional
   second string which is the textual description that will be displayed when
   the user passes --help on the command line.  If the number entry is negative
   then the specified bits will be cleared instead of being set.  If the second
   string entry is present but empty, then no help information will be displayed
   for that option, but it will not count as an undocumented option.  The actual
   option name, asseen on the command line is made by appending `-m' to the
   specified name.

   One of the subgroupings should have a null string.  The number in this
   grouping is the default value for `target_flags'.  Any target options act
   starting with that value.

   Here is an example which defines `-m68000' and `-m68020' with opposite
   meanings, and picks the latter as the default:

        #define TARGET_SWITCHES \
          { { "68020",  1, ""},      \
            { "68000", -1, "Compile for the m68000"},     \
            { "",       1, }}

   This declaration must be present.  */

#define TARGET_SWITCHES							    \
{{ "gpr-32",		  MASK_GPR_32,		"Only use 32 gprs"},	    \
 { "gpr-64",		 -MASK_GPR_32,		"Use 64 gprs"},		    \
 { "fpr-32",		  MASK_FPR_32,		"Only use 32 fprs"},	    \
 { "fpr-64",		 -MASK_FPR_32,		"Use 64 fprs"},		    \
 { "hard-float",	 -MASK_SOFT_FLOAT,	"Use hardware floating point" },\
 { "soft-float",	  MASK_SOFT_FLOAT,	"Use software floating point" },\
 { "alloc-cc",		  MASK_ALLOC_CC,	"Dynamically allocate cc's" }, \
 { "fixed-cc",		 -MASK_ALLOC_CC,	"Just use icc0/fcc0" },	    \
 { "dword",		  MASK_DWORD,		"Change ABI to allow double word insns" }, \
 { "no-dword",		 -MASK_DWORD,		"Do not use double word insns" }, \
 { "double",		  MASK_DOUBLE,		"Use fp double instructions" }, \
 { "no-double",		 -MASK_DOUBLE,		"Do not use fp double insns" }, \
 { "media",		  MASK_MEDIA,		"Use media instructions" }, \
 { "no-media",		 -MASK_MEDIA,		"Do not use media insns" }, \
 { "muladd",		  MASK_MULADD,		"Use multiply add/subtract instructions" }, \
 { "no-muladd",		 -MASK_MULADD,		"Do not use multiply add/subtract insns" }, \
 { "library-pic",	  MASK_LIBPIC,		"PIC support for building libraries" }, \
 { "acc-4",		  MASK_ACC_4,		"Use 4 media accumulators" }, \
 { "acc-8",		 -MASK_ACC_4,		"Use 8 media accumulators" }, \
 { "pack",		  MASK_PACK,		"Pack VLIW instructions" }, \
 { "no-pack",		 -MASK_PACK,		"Do not pack VLIW instructions" }, \
 { "no-eflags",		  0,			"Do not mark ABI switches in e_flags" }, \
 { "debug-arg",		  MASK_DEBUG_ARG,	"Internal debug switch" },  \
 { "debug-addr",	  MASK_DEBUG_ADDR,	"Internal debug switch" },  \
 { "debug-stack",	  MASK_DEBUG_STACK,	"Internal debug switch" },  \
 { "debug",		  MASK_DEBUG,		"Internal debug switch" },  \
 { "debug-cond-exec",	  MASK_DEBUG_COND_EXEC,	"Internal debug switch" },  \
 { "debug-loc",		  MASK_DEBUG_LOC,	"Internal debug switch" },  \
 { "cond-move",		 -MASK_NO_COND_MOVE,	"Enable conditional moves" },  \
 { "no-cond-move",	  MASK_NO_COND_MOVE,	"Disable conditional moves" },  \
 { "scc",		 -MASK_NO_SCC,		"Enable setting gprs to the result of comparisons" },  \
 { "no-scc",		  MASK_NO_SCC,		"Disable setting gprs to the result of comparisons" },  \
 { "cond-exec",		 -MASK_NO_COND_EXEC,	"Enable conditional execution other than moves/scc" }, \
 { "no-cond-exec",	  MASK_NO_COND_EXEC,	"Disable conditional execution other than moves/scc" }, \
 { "vliw-branch",	 -MASK_NO_VLIW_BRANCH,	"Run pass to pack branches into VLIW insns" }, \
 { "no-vliw-branch",	  MASK_NO_VLIW_BRANCH,	"Do not run pass to pack branches into VLIW insns" }, \
 { "multi-cond-exec",	 -MASK_NO_MULTI_CE,	"Disable optimizing &&/|| in conditional execution" }, \
 { "no-multi-cond-exec",  MASK_NO_MULTI_CE,	"Enable optimizing &&/|| in conditional execution" }, \
 { "nested-cond-exec",	 -MASK_NO_NESTED_CE,	"Enable nested conditional execution optimizations" }, \
 { "no-nested-cond-exec" ,MASK_NO_NESTED_CE,	"Disable nested conditional execution optimizations" }, \
 { "tomcat-stats",	  0, 			"Cause gas to print tomcat statistics" }, \
 { "",			  MASK_DEFAULT,		"" }}			    \

/* This macro is similar to `TARGET_SWITCHES' but defines names of command
   options that have values.  Its definition is an initializer with a
   subgrouping for each command option.

   Each subgrouping contains a string constant, that defines the fixed part of
   the option name, the address of a variable, and an optional description string.
   The variable, of type `char *', is set to the text following the fixed part of
   the option as it is specified on the command line.  The actual option name is
   made by appending `-m' to the specified name.

   Here is an example which defines `-mshort-data-NUMBER'.  If the given option
   is `-mshort-data-512', the variable `m88k_short_data' will be set to the
   string `"512"'.

        extern char *m88k_short_data;
        #define TARGET_OPTIONS \
         { { "short-data-", & m88k_short_data, \
	 "Specify the size of the short data section"  } }

   This declaration is optional.  */
#define TARGET_OPTIONS							      \
{									      \
  { "cpu=",		&frv_cpu_string,	 "Set cpu type", 0},	      \
  { "branch-cost=",	&frv_branch_cost_string, "Internal debug switch", 0}, \
  { "cond-exec-insns=", &frv_condexec_insns_str, "Internal debug switch", 0}, \
  { "cond-exec-temps=", &frv_condexec_temps_str, "Internal debug switch", 0}, \
  { "sched-lookahead=", &frv_sched_lookahead_str,"Internal debug switch", 0}, \
}

/* This macro is a C statement to print on `stderr' a string describing the
   particular machine description choice.  Every machine description should
   define `TARGET_VERSION'.  For example:

        #ifdef MOTOROLA
        #define TARGET_VERSION \
          fprintf (stderr, " (68k, Motorola syntax)");
        #else
        #define TARGET_VERSION \
          fprintf (stderr, " (68k, MIT syntax)");
        #endif  */
#define TARGET_VERSION fprintf (stderr, _(" (frv)"))

/* Sometimes certain combinations of command options do not make sense on a
   particular target machine.  You can define a macro `OVERRIDE_OPTIONS' to
   take account of this.  This macro, if defined, is executed once just after
   all the command options have been parsed.

   Don't use this macro to turn on various extra optimizations for `-O'.  That
   is what `OPTIMIZATION_OPTIONS' is for.  */

#define OVERRIDE_OPTIONS frv_override_options ()

/* Some machines may desire to change what optimizations are performed for
   various optimization levels.  This macro, if defined, is executed once just
   after the optimization level is determined and before the remainder of the
   command options have been parsed.  Values set in this macro are used as the
   default values for the other command line options.

   LEVEL is the optimization level specified; 2 if `-O2' is specified, 1 if
   `-O' is specified, and 0 if neither is specified.

   SIZE is nonzero if `-Os' is specified, 0 otherwise.

   You should not use this macro to change options that are not
   machine-specific.  These should uniformly selected by the same optimization
   level on all supported machines.  Use this macro to enable machbine-specific
   optimizations.

   *Do not examine `write_symbols' in this macro!* The debugging options are
   *not supposed to alter the generated code.  */
#define OPTIMIZATION_OPTIONS(LEVEL,SIZE) frv_optimization_options (LEVEL, SIZE)


/* Define this macro if debugging can be performed even without a frame
   pointer.  If this macro is defined, GCC will turn on the
   `-fomit-frame-pointer' option whenever `-O' is specified.  */
/* Frv needs a specific frame layout that includes the frame pointer.  */

#define CAN_DEBUG_WITHOUT_FP


/* Small Data Area Support.  */
/* Maximum size of variables that go in .sdata/.sbss.
   The -msdata=foo switch also controls how small variables are handled.  */
#ifndef SDATA_DEFAULT_SIZE
#define SDATA_DEFAULT_SIZE 8
#endif


/* Storage Layout */

/* Define this macro to have the value 1 if the most significant bit in a byte
   has the lowest number; otherwise define it to have the value zero.  This
   means that bit-field instructions count from the most significant bit.  If
   the machine has no bit-field instructions, then this must still be defined,
   but it doesn't matter which value it is defined to.  This macro need not be
   a constant.

   This macro does not affect the way structure fields are packed into bytes or
   words; that is controlled by `BYTES_BIG_ENDIAN'.  */
#define BITS_BIG_ENDIAN 1

/* Define this macro to have the value 1 if the most significant byte in a word
   has the lowest number.  This macro need not be a constant.  */
#define BYTES_BIG_ENDIAN 1

/* Define this macro to have the value 1 if, in a multiword object, the most
   significant word has the lowest number.  This applies to both memory
   locations and registers; GCC fundamentally assumes that the order of
   words in memory is the same as the order in registers.  This macro need not
   be a constant.  */
#define WORDS_BIG_ENDIAN 1

/* Number of storage units in a word; normally 4.  */
#define UNITS_PER_WORD 4

/* A macro to update MODE and UNSIGNEDP when an object whose type is TYPE and
   which has the specified mode and signedness is to be stored in a register.
   This macro is only called when TYPE is a scalar type.

   On most RISC machines, which only have operations that operate on a full
   register, define this macro to set M to `word_mode' if M is an integer mode
   narrower than `BITS_PER_WORD'.  In most cases, only integer modes should be
   widened because wider-precision floating-point operations are usually more
   expensive than their narrower counterparts.

   For most machines, the macro definition does not change UNSIGNEDP.  However,
   some machines, have instructions that preferentially handle either signed or
   unsigned quantities of certain modes.  For example, on the DEC Alpha, 32-bit
   loads from memory and 32-bit add instructions sign-extend the result to 64
   bits.  On such machines, set UNSIGNEDP according to which kind of extension
   is more efficient.

   Do not define this macro if it would never modify MODE.  */
#define PROMOTE_MODE(MODE, UNSIGNEDP, TYPE)	\
  do						\
    {						\
      if (GET_MODE_CLASS (MODE) == MODE_INT	\
	  && GET_MODE_SIZE (MODE) < 4)		\
	(MODE) = SImode;			\
    }						\
  while (0)

/* Normal alignment required for function parameters on the stack, in bits.
   All stack parameters receive at least this much alignment regardless of data
   type.  On most machines, this is the same as the size of an integer.  */
#define PARM_BOUNDARY 32

/* Define this macro if you wish to preserve a certain alignment for the stack
   pointer.  The definition is a C expression for the desired alignment
   (measured in bits).

   If `PUSH_ROUNDING' is not defined, the stack will always be aligned to the
   specified boundary.  If `PUSH_ROUNDING' is defined and specifies a less
   strict alignment than `STACK_BOUNDARY', the stack may be momentarily
   unaligned while pushing arguments.  */
#define STACK_BOUNDARY 64

/* Alignment required for a function entry point, in bits.  */
#define FUNCTION_BOUNDARY 128

/* Biggest alignment that any data type can require on this machine,
   in bits.  */
#define BIGGEST_ALIGNMENT 64

/* @@@ A hack, needed because libobjc wants to use ADJUST_FIELD_ALIGN for
   some reason.  */
#ifdef IN_TARGET_LIBS
#define BIGGEST_FIELD_ALIGNMENT 64
#else
/* An expression for the alignment of a structure field FIELD if the
   alignment computed in the usual way is COMPUTED.  GCC uses this
   value instead of the value in `BIGGEST_ALIGNMENT' or
   `BIGGEST_FIELD_ALIGNMENT', if defined, for structure fields only.  */
#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) 				\
  frv_adjust_field_align (FIELD, COMPUTED)
#endif

/* If defined, a C expression to compute the alignment for a static variable.
   TYPE is the data type, and ALIGN is the alignment that the object
   would ordinarily have.  The value of this macro is used instead of that
   alignment to align the object.

   If this macro is not defined, then ALIGN is used.

   One use of this macro is to increase alignment of medium-size data to make
   it all fit in fewer cache lines.  Another is to cause character arrays to be
   word-aligned so that `strcpy' calls that copy constants to character arrays
   can be done inline.  */
#define DATA_ALIGNMENT(TYPE, ALIGN)		\
  (TREE_CODE (TYPE) == ARRAY_TYPE		\
   && TYPE_MODE (TREE_TYPE (TYPE)) == QImode	\
   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))

/* If defined, a C expression to compute the alignment given to a constant that
   is being placed in memory.  CONSTANT is the constant and ALIGN is the
   alignment that the object would ordinarily have.  The value of this macro is
   used instead of that alignment to align the object.

   If this macro is not defined, then ALIGN is used.

   The typical use of this macro is to increase alignment for string constants
   to be word aligned so that `strcpy' calls that copy constants can be done
   inline.  */
#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \
  (TREE_CODE (EXP) == STRING_CST	\
   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))

/* Define this macro to be the value 1 if instructions will fail to work if
   given data not on the nominal alignment.  If instructions will merely go
   slower in that case, define this macro as 0.  */
#define STRICT_ALIGNMENT 1

/* Define this if you wish to imitate the way many other C compilers handle
   alignment of bitfields and the structures that contain them.

   The behavior is that the type written for a bit-field (`int', `short', or
   other integer type) imposes an alignment for the entire structure, as if the
   structure really did contain an ordinary field of that type.  In addition,
   the bit-field is placed within the structure so that it would fit within such
   a field, not crossing a boundary for it.

   Thus, on most machines, a bit-field whose type is written as `int' would not
   cross a four-byte boundary, and would force four-byte alignment for the
   whole structure.  (The alignment used may not be four bytes; it is
   controlled by the other alignment parameters.)

   If the macro is defined, its definition should be a C expression; a nonzero
   value for the expression enables this behavior.

   Note that if this macro is not defined, or its value is zero, some bitfields
   may cross more than one alignment boundary.  The compiler can support such
   references if there are `insv', `extv', and `extzv' insns that can directly
   reference memory.

   The other known way of making bitfields work is to define
   `STRUCTURE_SIZE_BOUNDARY' as large as `BIGGEST_ALIGNMENT'.  Then every
   structure can be accessed with fullwords.

   Unless the machine has bit-field instructions or you define
   `STRUCTURE_SIZE_BOUNDARY' that way, you must define
   `PCC_BITFIELD_TYPE_MATTERS' to have a nonzero value.

   If your aim is to make GCC use the same conventions for laying out
   bitfields as are used by another compiler, here is how to investigate what
   the other compiler does.  Compile and run this program:

        struct foo1
        {
          char x;
          char :0;
          char y;
        };

        struct foo2
        {
          char x;
          int :0;
          char y;
        };

        main ()
        {
          printf ("Size of foo1 is %d\n",
                  sizeof (struct foo1));
          printf ("Size of foo2 is %d\n",
                  sizeof (struct foo2));
          exit (0);
        }

   If this prints 2 and 5, then the compiler's behavior is what you would get
   from `PCC_BITFIELD_TYPE_MATTERS'.

   Defined in svr4.h.  */
#define PCC_BITFIELD_TYPE_MATTERS 1


/* Layout of Source Language Data Types.  */

#define CHAR_TYPE_SIZE         8
#define SHORT_TYPE_SIZE       16
#define INT_TYPE_SIZE         32
#define LONG_TYPE_SIZE        32
#define LONG_LONG_TYPE_SIZE   64
#define FLOAT_TYPE_SIZE       32
#define DOUBLE_TYPE_SIZE      64
#define LONG_DOUBLE_TYPE_SIZE 64

/* An expression whose value is 1 or 0, according to whether the type `char'
   should be signed or unsigned by default.  The user can always override this
   default with the options `-fsigned-char' and `-funsigned-char'.  */
#define DEFAULT_SIGNED_CHAR 1


/* General purpose registers.  */
#define GPR_FIRST       0                       /* First gpr */
#define GPR_LAST        (GPR_FIRST + 63)        /* Last gpr */
#define GPR_R0          GPR_FIRST               /* R0, constant 0 */
#define GPR_FP          (GPR_FIRST + 2)         /* Frame pointer */
#define GPR_SP          (GPR_FIRST + 1)         /* Stack pointer */
						/* small data register */
#define SDA_BASE_REG    ((unsigned)(flag_pic ? PIC_REGNO : (GPR_FIRST+16)))
#define PIC_REGNO       (GPR_FIRST + 17)        /* PIC register */

#define FPR_FIRST       64			/* First FP reg */
#define FPR_LAST        127			/* Last  FP reg */

#define DEFAULT_CONDEXEC_TEMPS 4		/* reserve 4 regs by default */
#define GPR_TEMP_NUM	frv_condexec_temps	/* # gprs to reserve for temps */

/* We reserve the last CR and CCR in each category to be used as a reload
   register to reload the CR/CCR registers.  This is a kludge.  */
#define CC_FIRST	128			/* First ICC/FCC reg */
#define CC_LAST		135			/* Last  ICC/FCC reg */
#define ICC_FIRST	(CC_FIRST + 4)		/* First ICC reg */
#define ICC_LAST	(CC_FIRST + 7)		/* Last  ICC reg */
#define ICC_TEMP	(CC_FIRST + 7)		/* Temporary ICC reg */
#define FCC_FIRST	(CC_FIRST)		/* First FCC reg */
#define FCC_LAST	(CC_FIRST + 3)		/* Last  FCC reg */

/* Amount to shift a value to locate a ICC or FCC register in the CCR
   register and shift it to the bottom 4 bits.  */
#define CC_SHIFT_RIGHT(REGNO) (((REGNO) - CC_FIRST) << 2)

/* Mask to isolate a single ICC/FCC value.  */
#define CC_MASK		0xf

/* Masks to isolate the various bits in an ICC field.  */
#define ICC_MASK_N	0x8	/* negative */
#define ICC_MASK_Z	0x4	/* zero */
#define ICC_MASK_V	0x2	/* overflow */
#define ICC_MASK_C	0x1	/* carry */

/* Mask to isolate the N/Z flags in an ICC.  */
#define ICC_MASK_NZ (ICC_MASK_N | ICC_MASK_Z)

/* Mask to isolate the Z/C flags in an ICC.  */
#define ICC_MASK_ZC (ICC_MASK_Z | ICC_MASK_C)

/* Masks to isolate the various bits in a FCC field.  */
#define FCC_MASK_E	0x8	/* equal */
#define FCC_MASK_L	0x4	/* less than */
#define FCC_MASK_G	0x2	/* greater than */
#define FCC_MASK_U	0x1	/* unordered */

/* For CCR registers, the machine wants CR4..CR7 to be used for integer
   code and CR0..CR3 to be used for floating point.  */
#define CR_FIRST	136			/* First CCR */
#define CR_LAST		143			/* Last  CCR */
#define CR_NUM		(CR_LAST-CR_FIRST+1)	/* # of CCRs (8) */
#define ICR_FIRST	(CR_FIRST + 4)		/* First integer CCR */
#define ICR_LAST	(CR_FIRST + 7)		/* Last  integer CCR */
#define ICR_TEMP	ICR_LAST		/* Temp  integer CCR */
#define FCR_FIRST	(CR_FIRST + 0)		/* First float CCR */
#define FCR_LAST	(CR_FIRST + 3)		/* Last  float CCR */

/* Amount to shift a value to locate a CR register in the CCCR special purpose
   register and shift it to the bottom 2 bits.  */
#define CR_SHIFT_RIGHT(REGNO) (((REGNO) - CR_FIRST) << 1)

/* Mask to isolate a single CR value.  */
#define CR_MASK		0x3

#define ACC_FIRST	144			/* First acc register */
#define ACC_LAST	151			/* Last  acc register */

#define ACCG_FIRST	152			/* First accg register */
#define ACCG_LAST	159			/* Last  accg register */

#define AP_FIRST	160			/* fake argument pointer */

#define SPR_FIRST	161
#define SPR_LAST	162
#define LR_REGNO	(SPR_FIRST)
#define LCR_REGNO	(SPR_FIRST + 1)

#define GPR_P(R)	IN_RANGE_P (R, GPR_FIRST, GPR_LAST)
#define GPR_OR_AP_P(R)	(GPR_P (R) || (R) == ARG_POINTER_REGNUM)
#define FPR_P(R)	IN_RANGE_P (R, FPR_FIRST, FPR_LAST)
#define CC_P(R)		IN_RANGE_P (R, CC_FIRST, CC_LAST)
#define ICC_P(R)	IN_RANGE_P (R, ICC_FIRST, ICC_LAST)
#define FCC_P(R)	IN_RANGE_P (R, FCC_FIRST, FCC_LAST)
#define CR_P(R)		IN_RANGE_P (R, CR_FIRST, CR_LAST)
#define ICR_P(R)	IN_RANGE_P (R, ICR_FIRST, ICR_LAST)
#define FCR_P(R)	IN_RANGE_P (R, FCR_FIRST, FCR_LAST)
#define ACC_P(R)	IN_RANGE_P (R, ACC_FIRST, ACC_LAST)
#define ACCG_P(R)	IN_RANGE_P (R, ACCG_FIRST, ACCG_LAST)
#define SPR_P(R)	IN_RANGE_P (R, SPR_FIRST, SPR_LAST)

#define GPR_OR_PSEUDO_P(R)	(GPR_P (R) || (R) >= FIRST_PSEUDO_REGISTER)
#define FPR_OR_PSEUDO_P(R)	(FPR_P (R) || (R) >= FIRST_PSEUDO_REGISTER)
#define GPR_AP_OR_PSEUDO_P(R)	(GPR_OR_AP_P (R) || (R) >= FIRST_PSEUDO_REGISTER)
#define CC_OR_PSEUDO_P(R)	(CC_P (R) || (R) >= FIRST_PSEUDO_REGISTER)
#define ICC_OR_PSEUDO_P(R)	(ICC_P (R) || (R) >= FIRST_PSEUDO_REGISTER)
#define FCC_OR_PSEUDO_P(R)	(FCC_P (R) || (R) >= FIRST_PSEUDO_REGISTER)
#define CR_OR_PSEUDO_P(R)	(CR_P (R) || (R) >= FIRST_PSEUDO_REGISTER)
#define ICR_OR_PSEUDO_P(R)	(ICR_P (R) || (R) >= FIRST_PSEUDO_REGISTER)
#define FCR_OR_PSEUDO_P(R)	(FCR_P (R) || (R) >= FIRST_PSEUDO_REGISTER)
#define ACC_OR_PSEUDO_P(R)	(ACC_P (R) || (R) >= FIRST_PSEUDO_REGISTER)
#define ACCG_OR_PSEUDO_P(R)	(ACCG_P (R) || (R) >= FIRST_PSEUDO_REGISTER)

#define MAX_STACK_IMMEDIATE_OFFSET 2047


/* Register Basics.  */

/* Number of hardware registers known to the compiler.  They receive numbers 0
   through `FIRST_PSEUDO_REGISTER-1'; thus, the first pseudo register's number
   really is assigned the number `FIRST_PSEUDO_REGISTER'.  */
#define FIRST_PSEUDO_REGISTER (SPR_LAST + 1)

/* The first/last register that can contain the arguments to a function.  */
#define FIRST_ARG_REGNUM	(GPR_FIRST + 8)
#define LAST_ARG_REGNUM		(FIRST_ARG_REGNUM + FRV_NUM_ARG_REGS - 1)

/* Registers used by the exception handling functions.  These should be
   registers that are not otherwised used by the calling sequence.  */
#define FIRST_EH_REGNUM		14
#define LAST_EH_REGNUM		15

/* Scratch registers used in the prologue, epilogue and thunks.
   OFFSET_REGNO is for loading constant addends that are too big for a
   single instruction.  TEMP_REGNO is used for transferring SPRs to and from
   the stack, and various other activities.  */
#define OFFSET_REGNO		4
#define TEMP_REGNO		5

/* Registers used in the prologue.  OLD_SP_REGNO is the old stack pointer,
   which is sometimes used to set up the frame pointer.  */
#define OLD_SP_REGNO		6

/* Registers used in the epilogue.  STACKADJ_REGNO stores the exception
   handler's stack adjustment.  */
#define STACKADJ_REGNO		6

/* Registers used in thunks.  JMP_REGNO is used for loading the target
   address.  */
#define JUMP_REGNO		6

#define EH_RETURN_DATA_REGNO(N)	((N) <= (LAST_EH_REGNUM - FIRST_EH_REGNUM)? \
				 (N) + FIRST_EH_REGNUM : INVALID_REGNUM)
#define EH_RETURN_STACKADJ_RTX	gen_rtx_REG (SImode, STACKADJ_REGNO)
#define EH_RETURN_HANDLER_RTX   RETURN_ADDR_RTX (0, frame_pointer_rtx)

/* An initializer that says which registers are used for fixed purposes all
   throughout the compiled code and are therefore not available for general
   allocation.  These would include the stack pointer, the frame pointer
   (except on machines where that can be used as a general register when no
   frame pointer is needed), the program counter on machines where that is
   considered one of the addressable registers, and any other numbered register
   with a standard use.

   This information is expressed as a sequence of numbers, separated by commas
   and surrounded by braces.  The Nth number is 1 if register N is fixed, 0
   otherwise.

   The table initialized from this macro, and the table initialized by the
   following one, may be overridden at run time either automatically, by the
   actions of the macro `CONDITIONAL_REGISTER_USAGE', or by the user with the
   command options `-ffixed-REG', `-fcall-used-REG' and `-fcall-saved-REG'.  */

/* gr0  -- Hard Zero
   gr1  -- Stack Pointer
   gr2  -- Frame Pointer
   gr3  -- Hidden Parameter
   gr16 -- Small Data reserved
   gr17 -- Pic reserved
   gr28 -- OS reserved
   gr29 -- OS reserved
   gr30 -- OS reserved
   gr31 -- OS reserved
   cr3  -- reserved to reload FCC registers.
   cr7  -- reserved to reload ICC registers.  */
#define FIXED_REGISTERS							\
{	/* Integer Registers */						\
	1, 1, 1, 1, 0, 0, 0, 0,		/* 000-007, gr0  - gr7  */	\
	0, 0, 0, 0, 0, 0, 0, 0,		/* 008-015, gr8  - gr15 */	\
	1, 1, 0, 0, 0, 0, 0, 0,		/* 016-023, gr16 - gr23 */	\
	0, 0, 0, 0, 1, 1, 1, 1,		/* 024-031, gr24 - gr31 */	\
	0, 0, 0, 0, 0, 0, 0, 0,		/* 032-039, gr32 - gr39 */	\
	0, 0, 0, 0, 0, 0, 0, 0,		/* 040-040, gr48 - gr47 */	\
	0, 0, 0, 0, 0, 0, 0, 0,		/* 048-055, gr48 - gr55 */	\
	0, 0, 0, 0, 0, 0, 0, 0,		/* 056-063, gr56 - gr63 */	\
	/* Float Registers */						\
	0, 0, 0, 0, 0, 0, 0, 0,		/* 064-071, fr0  - fr7  */	\
	0, 0, 0, 0, 0, 0, 0, 0,		/* 072-079, fr8  - fr15 */	\
	0, 0, 0, 0, 0, 0, 0, 0,		/* 080-087, fr16 - fr23 */	\
	0, 0, 0, 0, 0, 0, 0, 0,		/* 088-095, fr24 - fr31 */	\
	0, 0, 0, 0, 0, 0, 0, 0,		/* 096-103, fr32 - fr39 */	\
	0, 0, 0, 0, 0, 0, 0, 0,		/* 104-111, fr48 - fr47 */	\
	0, 0, 0, 0, 0, 0, 0, 0,		/* 112-119, fr48 - fr55 */	\
	0, 0, 0, 0, 0, 0, 0, 0,		/* 120-127, fr56 - fr63 */	\
	/* Condition Code Registers */					\
	0, 0, 0, 0,			/* 128-131, fcc0 - fcc3  */	\
	0, 0, 0, 1,			/* 132-135, icc0 - icc3 */	\
	/* Conditional execution Registers (CCR) */			\
	0, 0, 0, 0, 0, 0, 0, 1,		/* 136-143, cr0 - cr7 */	\
	/* Accumulators */						\
	1, 1, 1, 1, 1, 1, 1, 1,		/* 144-151, acc0  - acc7 */	\
	1, 1, 1, 1, 1, 1, 1, 1,		/* 152-159, accg0 - accg7 */	\
	/* Other registers */						\
	1,				/* 160, AP   - fake arg ptr */	\
	0,				/* 161, LR   - Link register*/	\
	0,				/* 162, LCR  - Loop count reg*/	\
}

/* Like `FIXED_REGISTERS' but has 1 for each register that is clobbered (in
   general) by function calls as well as for fixed registers.  This macro
   therefore identifies the registers that are not available for general
   allocation of values that must live across function calls.

   If a register has 0 in `CALL_USED_REGISTERS', the compiler automatically
   saves it on function entry and restores it on function exit, if the register
   is used within the function.  */
#define CALL_USED_REGISTERS						\
{	/* Integer Registers */						\
	1, 1, 1, 1, 1, 1, 1, 1,		/* 000-007, gr0  - gr7  */	\
	1, 1, 1, 1, 1, 1, 1, 1,		/* 008-015, gr8  - gr15 */	\
	1, 1, 0, 0, 0, 0, 0, 0,		/* 016-023, gr16 - gr23 */	\
	0, 0, 0, 0, 1, 1, 1, 1,		/* 024-031, gr24 - gr31 */	\
	1, 1, 1, 1, 1, 1, 1, 1,		/* 032-039, gr32 - gr39 */	\
	1, 1, 1, 1, 1, 1, 1, 1,		/* 040-040, gr48 - gr47 */	\
	0, 0, 0, 0, 0, 0, 0, 0,		/* 048-055, gr48 - gr55 */	\
	0, 0, 0, 0, 0, 0, 0, 0,		/* 056-063, gr56 - gr63 */	\
	/* Float Registers */						\
	1, 1, 1, 1, 1, 1, 1, 1,		/* 064-071, fr0  - fr7  */	\
	1, 1, 1, 1, 1, 1, 1, 1,		/* 072-079, fr8  - fr15 */	\
	0, 0, 0, 0, 0, 0, 0, 0,		/* 080-087, fr16 - fr23 */	\
	0, 0, 0, 0, 0, 0, 0, 0,		/* 088-095, fr24 - fr31 */	\
	1, 1, 1, 1, 1, 1, 1, 1,		/* 096-103, fr32 - fr39 */	\
	1, 1, 1, 1, 1, 1, 1, 1,		/* 104-111, fr48 - fr47 */	\
	0, 0, 0, 0, 0, 0, 0, 0,		/* 112-119, fr48 - fr55 */	\
	0, 0, 0, 0, 0, 0, 0, 0,		/* 120-127, fr56 - fr63 */	\
	/* Condition Code Registers */					\
	1, 1, 1, 1,			/* 128-131, fcc0 - fcc3 */	\
	1, 1, 1, 1,			/* 132-135, icc0 - icc3  */	\
	/* Conditional execution Registers (CCR) */			\
	1, 1, 1, 1, 1, 1, 1, 1,		/* 136-143, cr0 - cr7 */	\
	/* Accumulators */						\
	1, 1, 1, 1, 1, 1, 1, 1,		/* 144-151, acc0 - acc7 */	\
	1, 1, 1, 1, 1, 1, 1, 1,		/* 152-159, accg0 - accg7 */	\
	/* Other registers */						\
	1,				/* 160, AP  - fake arg ptr */	\
	1,				/* 161, LR  - Link register*/	\
	1,				/* 162, LCR - Loop count reg */	\
}

/* Zero or more C statements that may conditionally modify two variables
   `fixed_regs' and `call_used_regs' (both of type `char []') after they have
   been initialized from the two preceding macros.

   This is necessary in case the fixed or call-clobbered registers depend on
   target flags.

   You need not define this macro if it has no work to do.

   If the usage of an entire class of registers depends on the target flags,
   you may indicate this to GCC by using this macro to modify `fixed_regs' and
   `call_used_regs' to 1 for each of the registers in the classes which should
   not be used by GCC.  Also define the macro `REG_CLASS_FROM_LETTER' to return
   `NO_REGS' if it is called with a letter for a class that shouldn't be used.

   (However, if this class is not included in `GENERAL_REGS' and all of the
   insn patterns whose constraints permit this class are controlled by target
   switches, then GCC will automatically avoid using these registers when the
   target switches are opposed to them.)  */

#define CONDITIONAL_REGISTER_USAGE frv_conditional_register_usage ()


/* Order of allocation of registers.  */

/* If defined, an initializer for a vector of integers, containing the numbers
   of hard registers in the order in which GCC should prefer to use them
   (from most preferred to least).

   If this macro is not defined, registers are used lowest numbered first (all
   else being equal).

   One use of this macro is on machines where the highest numbered registers
   must always be saved and the save-multiple-registers instruction supports
   only sequences of consecutive registers.  On such machines, define
   `REG_ALLOC_ORDER' to be an initializer that lists the highest numbered
   allocatable register first.  */

/* On the FRV, allocate GR16 and GR17 after other saved registers so that we
   have a better chance of allocating 2 registers at a time and can use the
   double word load/store instructions in the prologue.  */
#define REG_ALLOC_ORDER							\
{									\
  /* volatile registers */						\
  GPR_FIRST  +  4, GPR_FIRST  +  5, GPR_FIRST  +  6, GPR_FIRST 	+  7,	\
  GPR_FIRST  +  8, GPR_FIRST  +  9, GPR_FIRST  + 10, GPR_FIRST 	+ 11,	\
  GPR_FIRST  + 12, GPR_FIRST  + 13, GPR_FIRST  + 14, GPR_FIRST 	+ 15,	\
  GPR_FIRST  + 32, GPR_FIRST  + 33, GPR_FIRST  + 34, GPR_FIRST 	+ 35,	\
  GPR_FIRST  + 36, GPR_FIRST  + 37, GPR_FIRST  + 38, GPR_FIRST 	+ 39,	\
  GPR_FIRST  + 40, GPR_FIRST  + 41, GPR_FIRST  + 42, GPR_FIRST 	+ 43,	\
  GPR_FIRST  + 44, GPR_FIRST  + 45, GPR_FIRST  + 46, GPR_FIRST 	+ 47,	\
									\
  FPR_FIRST  +  0, FPR_FIRST  +  1, FPR_FIRST  +  2, FPR_FIRST 	+  3,	\
  FPR_FIRST  +  4, FPR_FIRST  +  5, FPR_FIRST  +  6, FPR_FIRST 	+  7,	\
  FPR_FIRST  +  8, FPR_FIRST  +  9, FPR_FIRST  + 10, FPR_FIRST 	+ 11,	\
  FPR_FIRST  + 12, FPR_FIRST  + 13, FPR_FIRST  + 14, FPR_FIRST 	+ 15,	\
  FPR_FIRST  + 32, FPR_FIRST  + 33, FPR_FIRST  + 34, FPR_FIRST 	+ 35,	\
  FPR_FIRST  + 36, FPR_FIRST  + 37, FPR_FIRST  + 38, FPR_FIRST 	+ 39,	\
  FPR_FIRST  + 40, FPR_FIRST  + 41, FPR_FIRST  + 42, FPR_FIRST 	+ 43,	\
  FPR_FIRST  + 44, FPR_FIRST  + 45, FPR_FIRST  + 46, FPR_FIRST 	+ 47,	\
									\
  ICC_FIRST  +  0, ICC_FIRST  +  1, ICC_FIRST  +  2, ICC_FIRST 	+  3,	\
  FCC_FIRST  +  0, FCC_FIRST  +  1, FCC_FIRST  +  2, FCC_FIRST 	+  3,	\
  CR_FIRST   +  0, CR_FIRST   +  1, CR_FIRST   +  2, CR_FIRST  	+  3,	\
  CR_FIRST   +  4, CR_FIRST   +  5, CR_FIRST   +  6, CR_FIRST  	+  7,	\
									\
  /* saved registers */							\
  GPR_FIRST  + 18, GPR_FIRST  + 19,					\
  GPR_FIRST  + 20, GPR_FIRST  + 21, GPR_FIRST  + 22, GPR_FIRST 	+ 23,	\
  GPR_FIRST  + 24, GPR_FIRST  + 25, GPR_FIRST  + 26, GPR_FIRST 	+ 27,	\
  GPR_FIRST  + 48, GPR_FIRST  + 49, GPR_FIRST  + 50, GPR_FIRST 	+ 51,	\
  GPR_FIRST  + 52, GPR_FIRST  + 53, GPR_FIRST  + 54, GPR_FIRST 	+ 55,	\
  GPR_FIRST  + 56, GPR_FIRST  + 57, GPR_FIRST  + 58, GPR_FIRST 	+ 59,	\
  GPR_FIRST  + 60, GPR_FIRST  + 61, GPR_FIRST  + 62, GPR_FIRST 	+ 63,	\
  GPR_FIRST  + 16, GPR_FIRST  + 17,					\
									\
  FPR_FIRST  + 16, FPR_FIRST  + 17, FPR_FIRST  + 18, FPR_FIRST 	+ 19,	\
  FPR_FIRST  + 20, FPR_FIRST  + 21, FPR_FIRST  + 22, FPR_FIRST 	+ 23,	\
  FPR_FIRST  + 24, FPR_FIRST  + 25, FPR_FIRST  + 26, FPR_FIRST 	+ 27,	\
  FPR_FIRST  + 28, FPR_FIRST  + 29, FPR_FIRST  + 30, FPR_FIRST 	+ 31,	\
  FPR_FIRST  + 48, FPR_FIRST  + 49, FPR_FIRST  + 50, FPR_FIRST 	+ 51,	\
  FPR_FIRST  + 52, FPR_FIRST  + 53, FPR_FIRST  + 54, FPR_FIRST 	+ 55,	\
  FPR_FIRST  + 56, FPR_FIRST  + 57, FPR_FIRST  + 58, FPR_FIRST 	+ 59,	\
  FPR_FIRST  + 60, FPR_FIRST  + 61, FPR_FIRST  + 62, FPR_FIRST 	+ 63,	\
									\
  /* special or fixed registers */					\
  GPR_FIRST  +  0, GPR_FIRST  +  1, GPR_FIRST  +  2, GPR_FIRST 	+  3,	\
  GPR_FIRST  + 28, GPR_FIRST  + 29, GPR_FIRST  + 30, GPR_FIRST 	+ 31,	\
  ACC_FIRST  +  0, ACC_FIRST  +  1, ACC_FIRST  +  2, ACC_FIRST 	+  3,	\
  ACC_FIRST  +  4, ACC_FIRST  +  5, ACC_FIRST  +  6, ACC_FIRST 	+  7,	\
  ACCG_FIRST +  0, ACCG_FIRST +  1, ACCG_FIRST +  2, ACCG_FIRST	+  3,	\
  ACCG_FIRST +  4, ACCG_FIRST +  5, ACCG_FIRST +  6, ACCG_FIRST	+  7,	\
  AP_FIRST, 	   LR_REGNO,       LCR_REGNO				\
}


/* How Values Fit in Registers.  */

/* A C expression for the number of consecutive hard registers, starting at
   register number REGNO, required to hold a value of mode MODE.

   On a machine where all registers are exactly one word, a suitable definition
   of this macro is

        #define HARD_REGNO_NREGS(REGNO, MODE)            \
           ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1)  \
            / UNITS_PER_WORD))  */

/* On the FRV, make the CC modes take 3 words in the integer registers, so that
   we can build the appropriate instructions to properly reload the values.  */
#define HARD_REGNO_NREGS(REGNO, MODE) frv_hard_regno_nregs (REGNO, MODE)

/* A C expression that is nonzero if it is permissible to store a value of mode
   MODE in hard register number REGNO (or in several registers starting with
   that one).  For a machine where all registers are equivalent, a suitable
   definition is

        #define HARD_REGNO_MODE_OK(REGNO, MODE) 1

   It is not necessary for this macro to check for the numbers of fixed
   registers, because the allocation mechanism considers them to be always
   occupied.

   On some machines, double-precision values must be kept in even/odd register
   pairs.  The way to implement that is to define this macro to reject odd
   register numbers for such modes.

   The minimum requirement for a mode to be OK in a register is that the
   `movMODE' instruction pattern support moves between the register and any
   other hard register for which the mode is OK; and that moving a value into
   the register and back out not alter it.

   Since the same instruction used to move `SImode' will work for all narrower
   integer modes, it is not necessary on any machine for `HARD_REGNO_MODE_OK'
   to distinguish between these modes, provided you define patterns `movhi',
   etc., to take advantage of this.  This is useful because of the interaction
   between `HARD_REGNO_MODE_OK' and `MODES_TIEABLE_P'; it is very desirable for
   all integer modes to be tieable.

   Many machines have special registers for floating point arithmetic.  Often
   people assume that floating point machine modes are allowed only in floating
   point registers.  This is not true.  Any registers that can hold integers
   can safely *hold* a floating point machine mode, whether or not floating
   arithmetic can be done on it in those registers.  Integer move instructions
   can be used to move the values.

   On some machines, though, the converse is true: fixed-point machine modes
   may not go in floating registers.  This is true if the floating registers
   normalize any value stored in them, because storing a non-floating value
   there would garble it.  In this case, `HARD_REGNO_MODE_OK' should reject
   fixed-point machine modes in floating registers.  But if the floating
   registers do not automatically normalize, if you can store any bit pattern
   in one and retrieve it unchanged without a trap, then any machine mode may
   go in a floating register, so you can define this macro to say so.

   The primary significance of special floating registers is rather that they
   are the registers acceptable in floating point arithmetic instructions.
   However, this is of no concern to `HARD_REGNO_MODE_OK'.  You handle it by
   writing the proper constraints for those instructions.

   On some machines, the floating registers are especially slow to access, so
   that it is better to store a value in a stack frame than in such a register
   if floating point arithmetic is not being done.  As long as the floating
   registers are not in class `GENERAL_REGS', they will not be used unless some
   pattern's constraint asks for one.  */
#define HARD_REGNO_MODE_OK(REGNO, MODE) frv_hard_regno_mode_ok (REGNO, MODE)

/* A C expression that is nonzero if it is desirable to choose register
   allocation so as to avoid move instructions between a value of mode MODE1
   and a value of mode MODE2.

   If `HARD_REGNO_MODE_OK (R, MODE1)' and `HARD_REGNO_MODE_OK (R, MODE2)' are
   ever different for any R, then `MODES_TIEABLE_P (MODE1, MODE2)' must be
   zero.  */
#define MODES_TIEABLE_P(MODE1, MODE2) (MODE1 == MODE2)

/* Define this macro if the compiler should avoid copies to/from CCmode
   registers.  You should only define this macro if support fo copying to/from
   CCmode is incomplete.  */
#define AVOID_CCMODE_COPIES


/* Register Classes.  */

/* An enumeral type that must be defined with all the register class names as
   enumeral values.  `NO_REGS' must be first.  `ALL_REGS' must be the last
   register class, followed by one more enumeral value, `LIM_REG_CLASSES',
   which is not a register class but rather tells how many classes there are.

   Each register class has a number, which is the value of casting the class
   name to type `int'.  The number serves as an index in many of the tables
   described below.  */
enum reg_class
{
  NO_REGS,
  ICC_REGS,
  FCC_REGS,
  CC_REGS,
  ICR_REGS,
  FCR_REGS,
  CR_REGS,
  LCR_REG,
  LR_REG,
  SPR_REGS,
  QUAD_ACC_REGS,
  EVEN_ACC_REGS,
  ACC_REGS,
  ACCG_REGS,
  QUAD_FPR_REGS,
  FEVEN_REGS,
  FPR_REGS,
  QUAD_REGS,
  EVEN_REGS,
  GPR_REGS,
  ALL_REGS,
  LIM_REG_CLASSES
};

#define GENERAL_REGS GPR_REGS

/* The number of distinct register classes, defined as follows:

        #define N_REG_CLASSES (int) LIM_REG_CLASSES  */
#define N_REG_CLASSES ((int) LIM_REG_CLASSES)

/* An initializer containing the names of the register classes as C string
   constants.  These names are used in writing some of the debugging dumps.  */
#define REG_CLASS_NAMES {						\
   "NO_REGS",								\
   "ICC_REGS",								\
   "FCC_REGS",								\
   "CC_REGS",								\
   "ICR_REGS",								\
   "FCR_REGS",								\
   "CR_REGS",								\
   "LCR_REG",								\
   "LR_REG",								\
   "SPR_REGS",								\
   "QUAD_ACC_REGS",							\
   "EVEN_ACC_REGS",							\
   "ACC_REGS",								\
   "ACCG_REGS",								\
   "QUAD_FPR_REGS",							\
   "FEVEN_REGS",							\
   "FPR_REGS",								\
   "QUAD_REGS",								\
   "EVEN_REGS",								\
   "GPR_REGS",								\
   "ALL_REGS"								\
}

/* An initializer containing the contents of the register classes, as integers
   which are bit masks.  The Nth integer specifies the contents of class N.
   The way the integer MASK is interpreted is that register R is in the class
   if `MASK & (1 << R)' is 1.

   When the machine has more than 32 registers, an integer does not suffice.
   Then the integers are replaced by sub-initializers, braced groupings
   containing several integers.  Each sub-initializer must be suitable as an
   initializer for the type `HARD_REG_SET' which is defined in
   `hard-reg-set.h'.  */
#define REG_CLASS_CONTENTS						       \
{  /* gr0-gr31 gr32-gr63  fr0-fr31   fr32-fr-63 cc/ccr/acc ap/spr */	       \
  { 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x0}, /* NO_REGS  */\
  { 0x00000000,0x00000000,0x00000000,0x00000000,0x000000f0,0x0}, /* ICC_REGS */\
  { 0x00000000,0x00000000,0x00000000,0x00000000,0x0000000f,0x0}, /* FCC_REGS */\
  { 0x00000000,0x00000000,0x00000000,0x00000000,0x000000ff,0x0}, /* CC_REGS  */\
  { 0x00000000,0x00000000,0x00000000,0x00000000,0x0000f000,0x0}, /* ICR_REGS */\
  { 0x00000000,0x00000000,0x00000000,0x00000000,0x00000f00,0x0}, /* FCR_REGS */\
  { 0x00000000,0x00000000,0x00000000,0x00000000,0x0000ff00,0x0}, /* CR_REGS  */\
  { 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x4}, /* LCR_REGS */\
  { 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x2}, /* LR_REGS  */\
  { 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x6}, /* SPR_REGS */\
  { 0x00000000,0x00000000,0x00000000,0x00000000,0x00ff0000,0x0}, /* QUAD_ACC */\
  { 0x00000000,0x00000000,0x00000000,0x00000000,0x00ff0000,0x0}, /* EVEN_ACC */\
  { 0x00000000,0x00000000,0x00000000,0x00000000,0x00ff0000,0x0}, /* ACC_REGS */\
  { 0x00000000,0x00000000,0x00000000,0x00000000,0xff000000,0x0}, /* ACCG_REGS*/\
  { 0x00000000,0x00000000,0xffffffff,0xffffffff,0x00000000,0x0}, /* QUAD_FPR */\
  { 0x00000000,0x00000000,0xffffffff,0xffffffff,0x00000000,0x0}, /* FEVEN_REG*/\
  { 0x00000000,0x00000000,0xffffffff,0xffffffff,0x00000000,0x0}, /* FPR_REGS */\
  { 0x0ffffffc,0xffffffff,0x00000000,0x00000000,0x00000000,0x0}, /* QUAD_REGS*/\
  { 0xfffffffc,0xffffffff,0x00000000,0x00000000,0x00000000,0x0}, /* EVEN_REGS*/\
  { 0xffffffff,0xffffffff,0x00000000,0x00000000,0x00000000,0x1}, /* GPR_REGS */\
  { 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x7}, /* ALL_REGS */\
}

/* A C expression whose value is a register class containing hard register
   REGNO.  In general there is more than one such class; choose a class which
   is "minimal", meaning that no smaller class also contains the register.  */

extern enum reg_class regno_reg_class[];
#define REGNO_REG_CLASS(REGNO) regno_reg_class [REGNO]

/* A macro whose definition is the name of the class to which a valid base
   register must belong.  A base register is one used in an address which is
   the register value plus a displacement.  */
#define BASE_REG_CLASS GPR_REGS

/* A macro whose definition is the name of the class to which a valid index
   register must belong.  An index register is one used in an address where its
   value is either multiplied by a scale factor or added to another register
   (as well as added to a displacement).  */
#define INDEX_REG_CLASS GPR_REGS

/* A C expression which defines the machine-dependent operand constraint
   letters for register classes.  If CHAR is such a letter, the value should be
   the register class corresponding to it.  Otherwise, the value should be
   `NO_REGS'.  The register letter `r', corresponding to class `GENERAL_REGS',
   will not be passed to this macro; you do not need to handle it.

   The following letters are unavailable, due to being used as
   constraints:
	'0'..'9'
	'<', '>'
	'E', 'F', 'G', 'H'
	'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P'
	'Q', 'R', 'S', 'T', 'U'
	'V', 'X'
	'g', 'i', 'm', 'n', 'o', 'p', 'r', 's' */

extern enum reg_class reg_class_from_letter[];
#define REG_CLASS_FROM_LETTER(CHAR) reg_class_from_letter [(unsigned char)(CHAR)]

/* A C expression which is nonzero if register number NUM is suitable for use
   as a base register in operand addresses.  It may be either a suitable hard
   register or a pseudo register that has been allocated such a hard register.  */
#define REGNO_OK_FOR_BASE_P(NUM)           \
  ((NUM) < FIRST_PSEUDO_REGISTER           \
   ? GPR_P (NUM)                           \
   : (reg_renumber [NUM] >= 0 && GPR_P (reg_renumber [NUM])))

/* A C expression which is nonzero if register number NUM is suitable for use
   as an index register in operand addresses.  It may be either a suitable hard
   register or a pseudo register that has been allocated such a hard register.

   The difference between an index register and a base register is that the
   index register may be scaled.  If an address involves the sum of two
   registers, neither one of them scaled, then either one may be labeled the
   "base" and the other the "index"; but whichever labeling is used must fit
   the machine's constraints of which registers may serve in each capacity.
   The compiler will try both labelings, looking for one that is valid, and
   will reload one or both registers only if neither labeling works.  */
#define REGNO_OK_FOR_INDEX_P(NUM)                                       \
  ((NUM) < FIRST_PSEUDO_REGISTER                                        \
   ? GPR_P (NUM)                                                        \
   : (reg_renumber [NUM] >= 0 && GPR_P (reg_renumber [NUM])))

/* A C expression that places additional restrictions on the register class to
   use when it is necessary to copy value X into a register in class CLASS.
   The value is a register class; perhaps CLASS, or perhaps another, smaller
   class.  On many machines, the following definition is safe:

        #define PREFERRED_RELOAD_CLASS(X,CLASS) CLASS

   Sometimes returning a more restrictive class makes better code.  For
   example, on the 68000, when X is an integer constant that is in range for a
   `moveq' instruction, the value of this macro is always `DATA_REGS' as long
   as CLASS includes the data registers.  Requiring a data register guarantees
   that a `moveq' will be used.

   If X is a `const_double', by returning `NO_REGS' you can force X into a
   memory constant.  This is useful on certain machines where immediate
   floating values cannot be loaded into certain kinds of registers.

   This declaration must be present.  */
#define PREFERRED_RELOAD_CLASS(X, CLASS) CLASS

#define SECONDARY_INPUT_RELOAD_CLASS(CLASS, MODE, X) \
  frv_secondary_reload_class (CLASS, MODE, X, TRUE)

#define SECONDARY_OUTPUT_RELOAD_CLASS(CLASS, MODE, X) \
  frv_secondary_reload_class (CLASS, MODE, X, FALSE)

/* A C expression whose value is nonzero if pseudos that have been assigned to
   registers of class CLASS would likely be spilled because registers of CLASS
   are needed for spill registers.

   The default value of this macro returns 1 if CLASS has exactly one register
   and zero otherwise.  On most machines, this default should be used.  Only
   define this macro to some other expression if pseudo allocated by
   `local-alloc.c' end up in memory because their hard registers were needed
   for spill registers.  If this macro returns nonzero for those classes, those
   pseudos will only be allocated by `global.c', which knows how to reallocate
   the pseudo to another register.  If there would not be another register
   available for reallocation, you should not change the definition of this
   macro since the only effect of such a definition would be to slow down
   register allocation.  */
#define CLASS_LIKELY_SPILLED_P(CLASS) frv_class_likely_spilled_p (CLASS)

/* A C expression for the maximum number of consecutive registers of
   class CLASS needed to hold a value of mode MODE.

   This is closely related to the macro `HARD_REGNO_NREGS'.  In fact, the value
   of the macro `CLASS_MAX_NREGS (CLASS, MODE)' should be the maximum value of
   `HARD_REGNO_NREGS (REGNO, MODE)' for all REGNO values in the class CLASS.

   This macro helps control the handling of multiple-word values in
   the reload pass.

   This declaration is required.  */
#define CLASS_MAX_NREGS(CLASS, MODE) frv_class_max_nregs (CLASS, MODE)

#define ZERO_P(x) (x == CONST0_RTX (GET_MODE (x)))

/* 6 bit signed immediate.  */
#define CONST_OK_FOR_I(VALUE) IN_RANGE_P(VALUE, -32, 31)
/* 10 bit signed immediate.  */
#define CONST_OK_FOR_J(VALUE) IN_RANGE_P(VALUE, -512, 511)
/* Unused */
#define CONST_OK_FOR_K(VALUE)  0
/* 16 bit signed immediate.  */
#define CONST_OK_FOR_L(VALUE) IN_RANGE_P(VALUE, -32768, 32767)
/* 16 bit unsigned immediate.  */
#define CONST_OK_FOR_M(VALUE)  IN_RANGE_P (VALUE, 0, 65535)
/* 12 bit signed immediate that is negative.  */
#define CONST_OK_FOR_N(VALUE) IN_RANGE_P(VALUE, -2048, -1)
/* Zero */
#define CONST_OK_FOR_O(VALUE) ((VALUE) == 0)
/* 12 bit signed immediate that is negative.  */
#define CONST_OK_FOR_P(VALUE) IN_RANGE_P(VALUE, 1, 2047)

/* A C expression that defines the machine-dependent operand constraint letters
   (`I', `J', `K', .. 'P') that specify particular ranges of integer values.
   If C is one of those letters, the expression should check that VALUE, an
   integer, is in the appropriate range and return 1 if so, 0 otherwise.  If C
   is not one of those letters, the value should be 0 regardless of VALUE.  */
#define CONST_OK_FOR_LETTER_P(VALUE, C)		\
  (  (C) == 'I' ? CONST_OK_FOR_I (VALUE)        \
   : (C) == 'J' ? CONST_OK_FOR_J (VALUE)        \
   : (C) == 'K' ? CONST_OK_FOR_K (VALUE)        \
   : (C) == 'L' ? CONST_OK_FOR_L (VALUE)        \
   : (C) == 'M' ? CONST_OK_FOR_M (VALUE)        \
   : (C) == 'N' ? CONST_OK_FOR_N (VALUE)        \
   : (C) == 'O' ? CONST_OK_FOR_O (VALUE)        \
   : (C) == 'P' ? CONST_OK_FOR_P (VALUE)        \
   : 0)


/* A C expression that defines the machine-dependent operand constraint letters
   (`G', `H') that specify particular ranges of `const_double' values.

   If C is one of those letters, the expression should check that VALUE, an RTX
   of code `const_double', is in the appropriate range and return 1 if so, 0
   otherwise.  If C is not one of those letters, the value should be 0
   regardless of VALUE.

   `const_double' is used for all floating-point constants and for `DImode'
   fixed-point constants.  A given letter can accept either or both kinds of
   values.  It can use `GET_MODE' to distinguish between these kinds.  */

#define CONST_DOUBLE_OK_FOR_G(VALUE)					\
  ((GET_MODE (VALUE) == VOIDmode 					\
    && CONST_DOUBLE_LOW (VALUE) == 0					\
    && CONST_DOUBLE_HIGH (VALUE) == 0)					\
   || ((GET_MODE (VALUE) == SFmode					\
        || GET_MODE (VALUE) == DFmode)					\
       && (VALUE) == CONST0_RTX (GET_MODE (VALUE))))

#define CONST_DOUBLE_OK_FOR_H(VALUE) 0

#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C)				\
  (  (C) == 'G' ? CONST_DOUBLE_OK_FOR_G (VALUE)				\
   : (C) == 'H' ? CONST_DOUBLE_OK_FOR_H (VALUE)				\
   : 0)

/* A C expression that defines the optional machine-dependent constraint
   letters (`Q', `R', `S', `T', `U') that can be used to segregate specific
   types of operands, usually memory references, for the target machine.
   Normally this macro will not be defined.  If it is required for a particular
   target machine, it should return 1 if VALUE corresponds to the operand type
   represented by the constraint letter C.  If C is not defined as an extra
   constraint, the value returned should be 0 regardless of VALUE.

   For example, on the ROMP, load instructions cannot have their output in r0
   if the memory reference contains a symbolic address.  Constraint letter `Q'
   is defined as representing a memory address that does *not* contain a
   symbolic address.  An alternative is specified with a `Q' constraint on the
   input and `r' on the output.  The next alternative specifies `m' on the
   input and a register class that does not include r0 on the output.  */

/* Small data references */
#define EXTRA_CONSTRAINT_FOR_Q(VALUE)					\
  (small_data_symbolic_operand (VALUE, GET_MODE (VALUE)))

/* Double word memory ops that take one instruction.  */
#define EXTRA_CONSTRAINT_FOR_R(VALUE)					\
  (dbl_memory_one_insn_operand (VALUE, GET_MODE (VALUE)))

/* SYMBOL_REF */
#define EXTRA_CONSTRAINT_FOR_S(VALUE) (GET_CODE (VALUE) == SYMBOL_REF)

/* Double word memory ops that take two instructions.  */
#define EXTRA_CONSTRAINT_FOR_T(VALUE)					\
  (dbl_memory_two_insn_operand (VALUE, GET_MODE (VALUE)))

/* Memory operand for conditional execution.  */
#define EXTRA_CONSTRAINT_FOR_U(VALUE)					\
  (condexec_memory_operand (VALUE, GET_MODE (VALUE)))

#define EXTRA_CONSTRAINT(VALUE, C)					\
  (  (C) == 'Q'   ? EXTRA_CONSTRAINT_FOR_Q (VALUE)			\
   : (C) == 'R' ? EXTRA_CONSTRAINT_FOR_R (VALUE)			\
   : (C) == 'S' ? EXTRA_CONSTRAINT_FOR_S (VALUE)			\
   : (C) == 'T' ? EXTRA_CONSTRAINT_FOR_T (VALUE)			\
   : (C) == 'U' ? EXTRA_CONSTRAINT_FOR_U (VALUE)			\
   : 0)


/* Basic Stack Layout.  */

/* Structure to describe information about a saved range of registers */

typedef struct frv_stack_regs {
  const char * name;		/* name of the register ranges */
  int first;			/* first register in the range */
  int last;			/* last register in the range */
  int size_1word;		/* # of bytes to be stored via 1 word stores */
  int size_2words;		/* # of bytes to be stored via 2 word stores */
  unsigned char field_p;	/* true if the registers are a single SPR */
  unsigned char dword_p;	/* true if we can do dword stores */
  unsigned char special_p;	/* true if the regs have a fixed save loc.  */
} frv_stack_regs_t;

/* Register ranges to look into saving.  */
#define STACK_REGS_GPR		0	/* Gprs (normally gr16..gr31, gr48..gr63) */
#define STACK_REGS_FPR		1	/* Fprs (normally fr16..fr31, fr48..fr63) */
#define STACK_REGS_LR		2	/* LR register */
#define STACK_REGS_CC		3	/* CCrs (normally not saved) */
#define STACK_REGS_LCR		5	/* lcr register */
#define STACK_REGS_STDARG	6	/* stdarg registers */
#define STACK_REGS_STRUCT	7	/* structure return (gr3) */
#define STACK_REGS_FP		8	/* FP register */
#define STACK_REGS_MAX		9	/* # of register ranges */

/* Values for save_p field.  */
#define REG_SAVE_NO_SAVE	0	/* register not saved */
#define REG_SAVE_1WORD		1	/* save the register */
#define REG_SAVE_2WORDS		2	/* save register and register+1 */

/* Structure used to define the frv stack.  */

typedef struct frv_stack {
  int total_size;		/* total bytes allocated for stack */
  int vars_size;		/* variable save area size */
  int parameter_size;		/* outgoing parameter size */
  int stdarg_size;		/* size of regs needed to be saved for stdarg */
  int regs_size;		/* size of the saved registers */
  int regs_size_1word;		/* # of bytes to be stored via 1 word stores */
  int regs_size_2words;		/* # of bytes to be stored via 2 word stores */
  int header_size;		/* size of the old FP, struct ret., LR save */
  int pretend_size;		/* size of pretend args */
  int vars_offset;		/* offset to save local variables from new SP*/
  int regs_offset;		/* offset to save registers from new SP */
				/* register range information */
  frv_stack_regs_t regs[STACK_REGS_MAX];
				/* offset to store each register */
  int reg_offset[FIRST_PSEUDO_REGISTER];
				/* whether to save register (& reg+1) */
  unsigned char save_p[FIRST_PSEUDO_REGISTER];
} frv_stack_t;

/* Define this macro if pushing a word onto the stack moves the stack pointer
   to a smaller address.  */
#define STACK_GROWS_DOWNWARD 1

/* Define this macro if the addresses of local variable slots are at negative
   offsets from the frame pointer.  */
#define FRAME_GROWS_DOWNWARD

/* Offset from the frame pointer to the first local variable slot to be
   allocated.

   If `FRAME_GROWS_DOWNWARD', find the next slot's offset by subtracting the
   first slot's length from `STARTING_FRAME_OFFSET'.  Otherwise, it is found by
   adding the length of the first slot to the value `STARTING_FRAME_OFFSET'.  */
#define STARTING_FRAME_OFFSET 0

/* Offset from the stack pointer register to the first location at which
   outgoing arguments are placed.  If not specified, the default value of zero
   is used.  This is the proper value for most machines.

   If `ARGS_GROW_DOWNWARD', this is the offset to the location above the first
   location at which outgoing arguments are placed.  */
#define STACK_POINTER_OFFSET 0

/* Offset from the argument pointer register to the first argument's address.
   On some machines it may depend on the data type of the function.

   If `ARGS_GROW_DOWNWARD', this is the offset to the location above the first
   argument's address.  */
#define FIRST_PARM_OFFSET(FUNDECL) 0

/* A C expression whose value is RTL representing the address in a stack frame
   where the pointer to the caller's frame is stored.  Assume that FRAMEADDR is
   an RTL expression for the address of the stack frame itself.

   If you don't define this macro, the default is to return the value of
   FRAMEADDR--that is, the stack frame address is also the address of the stack
   word that points to the previous frame.  */
#define DYNAMIC_CHAIN_ADDRESS(FRAMEADDR) frv_dynamic_chain_address (FRAMEADDR)

/* A C expression whose value is RTL representing the value of the return
   address for the frame COUNT steps up from the current frame, after the
   prologue.  FRAMEADDR is the frame pointer of the COUNT frame, or the frame
   pointer of the COUNT - 1 frame if `RETURN_ADDR_IN_PREVIOUS_FRAME' is
   defined.

   The value of the expression must always be the correct address when COUNT is
   zero, but may be `NULL_RTX' if there is not way to determine the return
   address of other frames.  */
#define RETURN_ADDR_RTX(COUNT, FRAMEADDR) frv_return_addr_rtx (COUNT, FRAMEADDR)

/* This function contains machine specific function data.  */
struct machine_function GTY(())
{
  /* True if we have created an rtx that relies on the stack frame.  */
  int frame_needed;
};

#define RETURN_POINTER_REGNUM LR_REGNO

/* A C expression whose value is RTL representing the location of the incoming
   return address at the beginning of any function, before the prologue.  This
   RTL is either a `REG', indicating that the return value is saved in `REG',
   or a `MEM' representing a location in the stack.

   You only need to define this macro if you want to support call frame
   debugging information like that provided by DWARF 2.  */
#define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (SImode, RETURN_POINTER_REGNUM)


/* Register That Address the Stack Frame.  */

/* The register number of the stack pointer register, which must also be a
   fixed register according to `FIXED_REGISTERS'.  On most machines, the
   hardware determines which register this is.  */
#define STACK_POINTER_REGNUM (GPR_FIRST + 1)

/* The register number of the frame pointer register, which is used to access
   automatic variables in the stack frame.  On some machines, the hardware
   determines which register this is.  On other machines, you can choose any
   register you wish for this purpose.  */
#define FRAME_POINTER_REGNUM (GPR_FIRST + 2)

/* The register number of the arg pointer register, which is used to access the
   function's argument list.  On some machines, this is the same as the frame
   pointer register.  On some machines, the hardware determines which register
   this is.  On other machines, you can choose any register you wish for this
   purpose.  If this is not the same register as the frame pointer register,
   then you must mark it as a fixed register according to `FIXED_REGISTERS', or
   arrange to be able to eliminate it.  */

/* On frv this is a fake register that is eliminated in
   terms of either the frame pointer or stack pointer.  */
#define ARG_POINTER_REGNUM AP_FIRST

/* Register numbers used for passing a function's static chain pointer.  If
   register windows are used, the register number as seen by the called
   function is `STATIC_CHAIN_INCOMING_REGNUM', while the register number as
   seen by the calling function is `STATIC_CHAIN_REGNUM'.  If these registers
   are the same, `STATIC_CHAIN_INCOMING_REGNUM' need not be defined.

   The static chain register need not be a fixed register.

   If the static chain is passed in memory, these macros should not be defined;
   instead, the next two macros should be defined.  */
#define STATIC_CHAIN_REGNUM (GPR_FIRST + 7)
#define STATIC_CHAIN_INCOMING_REGNUM (GPR_FIRST + 7)


/* Eliminating the Frame Pointer and the Arg Pointer.  */

/* A C expression which is nonzero if a function must have and use a frame
   pointer.  This expression is evaluated in the reload pass.  If its value is
   nonzero the function will have a frame pointer.

   The expression can in principle examine the current function and decide
   according to the facts, but on most machines the constant 0 or the constant
   1 suffices.  Use 0 when the machine allows code to be generated with no
   frame pointer, and doing so saves some time or space.  Use 1 when there is
   no possible advantage to avoiding a frame pointer.

   In certain cases, the compiler does not know how to produce valid code
   without a frame pointer.  The compiler recognizes those cases and
   automatically gives the function a frame pointer regardless of what
   `FRAME_POINTER_REQUIRED' says.  You don't need to worry about them.

   In a function that does not require a frame pointer, the frame pointer
   register can be allocated for ordinary usage, unless you mark it as a fixed
   register.  See `FIXED_REGISTERS' for more information.  */
#define FRAME_POINTER_REQUIRED frv_frame_pointer_required ()

/* If defined, this macro specifies a table of register pairs used to eliminate
   unneeded registers that point into the stack frame.  If it is not defined,
   the only elimination attempted by the compiler is to replace references to
   the frame pointer with references to the stack pointer.

   The definition of this macro is a list of structure initializations, each of
   which specifies an original and replacement register.

   On some machines, the position of the argument pointer is not known until
   the compilation is completed.  In such a case, a separate hard register must
   be used for the argument pointer.  This register can be eliminated by
   replacing it with either the frame pointer or the argument pointer,
   depending on whether or not the frame pointer has been eliminated.

   In this case, you might specify:
        #define ELIMINABLE_REGS  \
        {{ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
         {ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \
         {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}}

   Note that the elimination of the argument pointer with the stack pointer is
   specified first since that is the preferred elimination.  */

#define ELIMINABLE_REGS							\
{									\
  {ARG_POINTER_REGNUM,	 STACK_POINTER_REGNUM},				\
  {ARG_POINTER_REGNUM,	 FRAME_POINTER_REGNUM},				\
  {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}				\
}

/* A C expression that returns nonzero if the compiler is allowed to try to
   replace register number FROM with register number TO.  This macro need only
   be defined if `ELIMINABLE_REGS' is defined, and will usually be the constant
   1, since most of the cases preventing register elimination are things that
   the compiler already knows about.  */

#define CAN_ELIMINATE(FROM, TO)						\
  ((FROM) == ARG_POINTER_REGNUM && (TO) == STACK_POINTER_REGNUM		\
   ? ! frame_pointer_needed						\
   : 1)

/* This macro is similar to `INITIAL_FRAME_POINTER_OFFSET'.  It specifies the
   initial difference between the specified pair of registers.  This macro must
   be defined if `ELIMINABLE_REGS' is defined.  */

#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET)			\
  (OFFSET) = frv_initial_elimination_offset (FROM, TO)


/* Passing Function Arguments on the Stack.  */

/* If defined, the maximum amount of space required for outgoing arguments will
   be computed and placed into the variable
   `current_function_outgoing_args_size'.  No space will be pushed onto the
   stack for each call; instead, the function prologue should increase the
   stack frame size by this amount.

   Defining both `PUSH_ROUNDING' and `ACCUMULATE_OUTGOING_ARGS' is not
   proper.  */
#define ACCUMULATE_OUTGOING_ARGS 1

/* A C expression that should indicate the number of bytes of its own arguments
   that a function pops on returning, or 0 if the function pops no arguments
   and the caller must therefore pop them all after the function returns.

   FUNDECL is a C variable whose value is a tree node that describes the
   function in question.  Normally it is a node of type `FUNCTION_DECL' that
   describes the declaration of the function.  From this it is possible to
   obtain the DECL_ATTRIBUTES of the function.

   FUNTYPE is a C variable whose value is a tree node that describes the
   function in question.  Normally it is a node of type `FUNCTION_TYPE' that
   describes the data type of the function.  From this it is possible to obtain
   the data types of the value and arguments (if known).

   When a call to a library function is being considered, FUNTYPE will contain
   an identifier node for the library function.  Thus, if you need to
   distinguish among various library functions, you can do so by their names.
   Note that "library function" in this context means a function used to
   perform arithmetic, whose name is known specially in the compiler and was
   not mentioned in the C code being compiled.

   STACK-SIZE is the number of bytes of arguments passed on the stack.  If a
   variable number of bytes is passed, it is zero, and argument popping will
   always be the responsibility of the calling function.

   On the VAX, all functions always pop their arguments, so the definition of
   this macro is STACK-SIZE.  On the 68000, using the standard calling
   convention, no functions pop their arguments, so the value of the macro is
   always 0 in this case.  But an alternative calling convention is available
   in which functions that take a fixed number of arguments pop them but other
   functions (such as `printf') pop nothing (the caller pops all).  When this
   convention is in use, FUNTYPE is examined to determine whether a function
   takes a fixed number of arguments.  */
#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACK_SIZE) 0


/* Function Arguments in Registers.  */

/* Nonzero if we do not know how to pass TYPE solely in registers.
   We cannot do so in the following cases:

   - if the type has variable size
   - if the type is marked as addressable (it is required to be constructed
     into the stack)
   - if the type is a structure or union.  */

#define MUST_PASS_IN_STACK(MODE,TYPE)                           \
   (((MODE) == BLKmode)                                         \
    || ((TYPE) != 0                                             \
         && (TREE_CODE (TYPE_SIZE (TYPE)) != INTEGER_CST        \
             || TREE_CODE (TYPE) == RECORD_TYPE                 \
             || TREE_CODE (TYPE) == UNION_TYPE                  \
             || TREE_CODE (TYPE) == QUAL_UNION_TYPE             \
             || TREE_ADDRESSABLE (TYPE))))

/* The number of register assigned to holding function arguments.  */

#define FRV_NUM_ARG_REGS        6

/* A C expression that controls whether a function argument is passed in a
   register, and which register.

   The arguments are CUM, of type CUMULATIVE_ARGS, which summarizes (in a way
   defined by INIT_CUMULATIVE_ARGS and FUNCTION_ARG_ADVANCE) all of the previous
   arguments so far passed in registers; MODE, the machine mode of the argument;
   TYPE, the data type of the argument as a tree node or 0 if that is not known
   (which happens for C support library functions); and NAMED, which is 1 for an
   ordinary argument and 0 for nameless arguments that correspond to `...' in the
   called function's prototype.

   The value of the expression should either be a `reg' RTX for the hard
   register in which to pass the argument, or zero to pass the argument on the
   stack.

   For machines like the VAX and 68000, where normally all arguments are
   pushed, zero suffices as a definition.

   The usual way to make the ANSI library `stdarg.h' work on a machine where
   some arguments are usually passed in registers, is to cause nameless
   arguments to be passed on the stack instead.  This is done by making
   `FUNCTION_ARG' return 0 whenever NAMED is 0.

   You may use the macro `MUST_PASS_IN_STACK (MODE, TYPE)' in the definition of
   this macro to determine if this argument is of a type that must be passed in
   the stack.  If `REG_PARM_STACK_SPACE' is not defined and `FUNCTION_ARG'
   returns nonzero for such an argument, the compiler will abort.  If
   `REG_PARM_STACK_SPACE' is defined, the argument will be computed in the
   stack and then loaded into a register.  */
#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED)                    \
  frv_function_arg (&CUM, MODE, TYPE, NAMED, FALSE)

/* Define this macro if the target machine has "register windows", so that the
   register in which a function sees an arguments is not necessarily the same
   as the one in which the caller passed the argument.

   For such machines, `FUNCTION_ARG' computes the register in which the caller
   passes the value, and `FUNCTION_INCOMING_ARG' should be defined in a similar
   fashion to tell the function being called where the arguments will arrive.

   If `FUNCTION_INCOMING_ARG' is not defined, `FUNCTION_ARG' serves both
   purposes.  */

#define FUNCTION_INCOMING_ARG(CUM, MODE, TYPE, NAMED)			\
  frv_function_arg (&CUM, MODE, TYPE, NAMED, TRUE)

/* A C expression for the number of words, at the beginning of an argument,
   must be put in registers.  The value must be zero for arguments that are
   passed entirely in registers or that are entirely pushed on the stack.

   On some machines, certain arguments must be passed partially in registers
   and partially in memory.  On these machines, typically the first N words of
   arguments are passed in registers, and the rest on the stack.  If a
   multi-word argument (a `double' or a structure) crosses that boundary, its
   first few words must be passed in registers and the rest must be pushed.
   This macro tells the compiler when this occurs, and how many of the words
   should go in registers.

   `FUNCTION_ARG' for these arguments should return the first register to be
   used by the caller for this argument; likewise `FUNCTION_INCOMING_ARG', for
   the called function.  */
#define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED)		\
  frv_function_arg_partial_nregs (&CUM, MODE, TYPE, NAMED)

/* extern int frv_function_arg_partial_nregs (CUMULATIVE_ARGS, int, Tree, int);  */

/* A C expression that indicates when an argument must be passed by reference.
   If nonzero for an argument, a copy of that argument is made in memory and a
   pointer to the argument is passed instead of the argument itself.  The
   pointer is passed in whatever way is appropriate for passing a pointer to
   that type.

   On machines where `REG_PARM_STACK_SPACE' is not defined, a suitable
   definition of this macro might be
        #define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED)  \
          MUST_PASS_IN_STACK (MODE, TYPE)  */
#define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED)		\
  frv_function_arg_pass_by_reference (&CUM, MODE, TYPE, NAMED)

/* If defined, a C expression that indicates when it is the called function's
   responsibility to make a copy of arguments passed by invisible reference.
   Normally, the caller makes a copy and passes the address of the copy to the
   routine being called.  When FUNCTION_ARG_CALLEE_COPIES is defined and is
   nonzero, the caller does not make a copy.  Instead, it passes a pointer to
   the "live" value.  The called function must not modify this value.  If it
   can be determined that the value won't be modified, it need not make a copy;
   otherwise a copy must be made.  */
#define FUNCTION_ARG_CALLEE_COPIES(CUM, MODE, TYPE, NAMED)		\
  frv_function_arg_callee_copies (&CUM, MODE, TYPE, NAMED)

/* If defined, a C expression that indicates when it is more desirable to keep
   an argument passed by invisible reference as a reference, rather than
   copying it to a pseudo register.  */
#define FUNCTION_ARG_KEEP_AS_REFERENCE(CUM, MODE, TYPE, NAMED)		\
  frv_function_arg_keep_as_reference (&CUM, MODE, TYPE, NAMED)

/* A C type for declaring a variable that is used as the first argument of
   `FUNCTION_ARG' and other related values.  For some target machines, the type
   `int' suffices and can hold the number of bytes of argument so far.

   There is no need to record in `CUMULATIVE_ARGS' anything about the arguments
   that have been passed on the stack.  The compiler has other variables to
   keep track of that.  For target machines on which all arguments are passed
   on the stack, there is no need to store anything in `CUMULATIVE_ARGS';
   however, the data structure must exist and should not be empty, so use
   `int'.  */
#define CUMULATIVE_ARGS int

/* A C statement (sans semicolon) for initializing the variable CUM for the
   state at the beginning of the argument list.  The variable has type
   `CUMULATIVE_ARGS'.  The value of FNTYPE is the tree node for the data type
   of the function which will receive the args, or 0 if the args are to a
   compiler support library function.  The value of INDIRECT is nonzero when
   processing an indirect call, for example a call through a function pointer.
   The value of INDIRECT is zero for a call to an explicitly named function, a
   library function call, or when `INIT_CUMULATIVE_ARGS' is used to find
   arguments for the function being compiled.

   When processing a call to a compiler support library function, LIBNAME
   identifies which one.  It is a `symbol_ref' rtx which contains the name of
   the function, as a string.  LIBNAME is 0 when an ordinary C function call is
   being processed.  Thus, each time this macro is called, either LIBNAME or
   FNTYPE is nonzero, but never both of them at once.  */

#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \
  frv_init_cumulative_args (&CUM, FNTYPE, LIBNAME, FNDECL, FALSE)

/* Like `INIT_CUMULATIVE_ARGS' but overrides it for the purposes of finding the
   arguments for the function being compiled.  If this macro is undefined,
   `INIT_CUMULATIVE_ARGS' is used instead.

   The value passed for LIBNAME is always 0, since library routines with
   special calling conventions are never compiled with GCC.  The argument
   LIBNAME exists for symmetry with `INIT_CUMULATIVE_ARGS'.  */

#define INIT_CUMULATIVE_INCOMING_ARGS(CUM, FNTYPE, LIBNAME) \
  frv_init_cumulative_args (&CUM, FNTYPE, LIBNAME, NULL, TRUE)

/* A C statement (sans semicolon) to update the summarizer variable CUM to
   advance past an argument in the argument list.  The values MODE, TYPE and
   NAMED describe that argument.  Once this is done, the variable CUM is
   suitable for analyzing the *following* argument with `FUNCTION_ARG', etc.

   This macro need not do anything if the argument in question was passed on
   the stack.  The compiler knows how to track the amount of stack space used
   for arguments without any special help.  */
#define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED)			\
  frv_function_arg_advance (&CUM, MODE, TYPE, NAMED)

/* If defined, a C expression that gives the alignment boundary, in bits, of an
   argument with the specified mode and type.  If it is not defined,
   `PARM_BOUNDARY' is used for all arguments.  */

#define FUNCTION_ARG_BOUNDARY(MODE, TYPE) \
  frv_function_arg_boundary (MODE, TYPE)

/* A C expression that is nonzero if REGNO is the number of a hard register in
   which function arguments are sometimes passed.  This does *not* include
   implicit arguments such as the static chain and the structure-value address.
   On many machines, no registers can be used for this purpose since all
   function arguments are pushed on the stack.  */
#define FUNCTION_ARG_REGNO_P(REGNO) \
  ((REGNO) >= FIRST_ARG_REGNUM && ((REGNO) <= LAST_ARG_REGNUM))


/* How Scalar Function Values are Returned.  */

/* The number of the hard register that is used to return a scalar value from a
   function call.  */
#define RETURN_VALUE_REGNUM	(GPR_FIRST + 8)

/* A C expression to create an RTX representing the place where a function
   returns a value of data type VALTYPE.  VALTYPE is a tree node representing a
   data type.  Write `TYPE_MODE (VALTYPE)' to get the machine mode used to
   represent that type.  On many machines, only the mode is relevant.
   (Actually, on most machines, scalar values are returned in the same place
   regardless of mode).

   If `PROMOTE_FUNCTION_RETURN' is defined, you must apply the same promotion
   rules specified in `PROMOTE_MODE' if VALTYPE is a scalar type.

   If the precise function being called is known, FUNC is a tree node
   (`FUNCTION_DECL') for it; otherwise, FUNC is a null pointer.  This makes it
   possible to use a different value-returning convention for specific
   functions when all their calls are known.

   `FUNCTION_VALUE' is not used for return vales with aggregate data types,
   because these are returned in another way.  See `STRUCT_VALUE_REGNUM' and
   related macros, below.  */
#define FUNCTION_VALUE(VALTYPE, FUNC) \
  gen_rtx (REG, TYPE_MODE (VALTYPE), RETURN_VALUE_REGNUM)

/* A C expression to create an RTX representing the place where a library
   function returns a value of mode MODE.

   Note that "library function" in this context means a compiler support
   routine, used to perform arithmetic, whose name is known specially by the
   compiler and was not mentioned in the C code being compiled.

   The definition of `LIBRARY_VALUE' need not be concerned aggregate data
   types, because none of the library functions returns such types.  */
#define LIBCALL_VALUE(MODE) gen_rtx (REG, MODE, RETURN_VALUE_REGNUM)

/* A C expression that is nonzero if REGNO is the number of a hard register in
   which the values of called function may come back.

   A register whose use for returning values is limited to serving as the
   second of a pair (for a value of type `double', say) need not be recognized
   by this macro.  So for most machines, this definition suffices:

        #define FUNCTION_VALUE_REGNO_P(N) ((N) == RETURN)

   If the machine has register windows, so that the caller and the called
   function use different registers for the return value, this macro should
   recognize only the caller's register numbers.  */
#define FUNCTION_VALUE_REGNO_P(REGNO) ((REGNO) == RETURN_VALUE_REGNUM)


/* How Large Values are Returned.  */

/* If the structure value address is passed in a register, then
   `STRUCT_VALUE_REGNUM' should be the number of that register.  */
#define STRUCT_VALUE_REGNUM (GPR_FIRST + 3)


/* Function Entry and Exit.  */

/* Define this macro as a C expression that is nonzero if the return
   instruction or the function epilogue ignores the value of the stack pointer;
   in other words, if it is safe to delete an instruction to adjust the stack
   pointer before a return from the function.

   Note that this macro's value is relevant only for functions for which frame
   pointers are maintained.  It is never safe to delete a final stack
   adjustment in a function that has no frame pointer, and the compiler knows
   this regardless of `EXIT_IGNORE_STACK'.  */
#define EXIT_IGNORE_STACK 1

/* Generating Code for Profiling.  */

/* A C statement or compound statement to output to FILE some assembler code to
   call the profiling subroutine `mcount'.  Before calling, the assembler code
   must load the address of a counter variable into a register where `mcount'
   expects to find the address.  The name of this variable is `LP' followed by
   the number LABELNO, so you would generate the name using `LP%d' in a
   `fprintf'.

   The details of how the address should be passed to `mcount' are determined
   by your operating system environment, not by GCC.  To figure them out,
   compile a small program for profiling using the system's installed C
   compiler and look at the assembler code that results.

   This declaration must be present, but it can be an abort if profiling is
   not implemented.  */

#define FUNCTION_PROFILER(FILE, LABELNO)


/* Implementing the Varargs Macros.  */

/* If defined, is a C expression that produces the machine-specific code for a
   call to `__builtin_saveregs'.  This code will be moved to the very beginning
   of the function, before any parameter access are made.  The return value of
   this function should be an RTX that contains the value to use as the return
   of `__builtin_saveregs'.

   If this macro is not defined, the compiler will output an ordinary call to
   the library function `__builtin_saveregs'.  */

#define EXPAND_BUILTIN_SAVEREGS() frv_expand_builtin_saveregs ()

/* This macro offers an alternative to using `__builtin_saveregs' and defining
   the macro `EXPAND_BUILTIN_SAVEREGS'.  Use it to store the anonymous register
   arguments into the stack so that all the arguments appear to have been
   passed consecutively on the stack.  Once this is done, you can use the
   standard implementation of varargs that works for machines that pass all
   their arguments on the stack.

   The argument ARGS_SO_FAR is the `CUMULATIVE_ARGS' data structure, containing
   the values that obtain after processing of the named arguments.  The
   arguments MODE and TYPE describe the last named argument--its machine mode
   and its data type as a tree node.

   The macro implementation should do two things: first, push onto the stack
   all the argument registers *not* used for the named arguments, and second,
   store the size of the data thus pushed into the `int'-valued variable whose
   name is supplied as the argument PRETEND_ARGS_SIZE.  The value that you
   store here will serve as additional offset for setting up the stack frame.

   Because you must generate code to push the anonymous arguments at compile
   time without knowing their data types, `SETUP_INCOMING_VARARGS' is only
   useful on machines that have just a single category of argument register and
   use it uniformly for all data types.

   If the argument SECOND_TIME is nonzero, it means that the arguments of the
   function are being analyzed for the second time.  This happens for an inline
   function, which is not actually compiled until the end of the source file.
   The macro `SETUP_INCOMING_VARARGS' should not generate any instructions in
   this case.  */
#define SETUP_INCOMING_VARARGS(ARGS_SO_FAR, MODE, TYPE, PRETEND_ARGS_SIZE, SECOND_TIME) \
  frv_setup_incoming_varargs (& ARGS_SO_FAR, (int) MODE, TYPE, 	\
			      & PRETEND_ARGS_SIZE, SECOND_TIME)

/* Implement the stdarg/varargs va_start macro.  STDARG_P is nonzero if this
   is stdarg.h instead of varargs.h.  VALIST is the tree of the va_list
   variable to initialize.  NEXTARG is the machine independent notion of the
   'next' argument after the variable arguments.  If not defined, a standard
   implementation will be defined that works for arguments passed on the stack.  */

#define EXPAND_BUILTIN_VA_START(VALIST, NEXTARG)		\
  (frv_expand_builtin_va_start(VALIST, NEXTARG))

/* Implement the stdarg/varargs va_arg macro.  VALIST is the variable of type
   va_list as a tree, TYPE is the type passed to va_arg.  */

#define EXPAND_BUILTIN_VA_ARG(VALIST, TYPE)				\
  (frv_expand_builtin_va_arg (VALIST, TYPE))


/* Trampolines for Nested Functions.  */

/* A C expression for the size in bytes of the trampoline, as an integer.  */
#define TRAMPOLINE_SIZE frv_trampoline_size ()

/* Alignment required for trampolines, in bits.

   If you don't define this macro, the value of `BIGGEST_ALIGNMENT' is used for
   aligning trampolines.  */
#define TRAMPOLINE_ALIGNMENT 32

/* A C statement to initialize the variable parts of a trampoline.  ADDR is an
   RTX for the address of the trampoline; FNADDR is an RTX for the address of
   the nested function; STATIC_CHAIN is an RTX for the static chain value that
   should be passed to the function when it is called.  */
#define INITIALIZE_TRAMPOLINE(ADDR, FNADDR, STATIC_CHAIN) \
  frv_initialize_trampoline (ADDR, FNADDR, STATIC_CHAIN)

/* Define this macro if trampolines need a special subroutine to do their work.
   The macro should expand to a series of `asm' statements which will be
   compiled with GCC.  They go in a library function named
   `__transfer_from_trampoline'.

   If you need to avoid executing the ordinary prologue code of a compiled C
   function when you jump to the subroutine, you can do so by placing a special
   label of your own in the assembler code.  Use one `asm' statement to
   generate an assembler label, and another to make the label global.  Then
   trampolines can use that label to jump directly to your special assembler
   code.  */

#ifdef __FRV_UNDERSCORE__
#define TRAMPOLINE_TEMPLATE_NAME "___trampoline_template"
#else
#define TRAMPOLINE_TEMPLATE_NAME "__trampoline_template"
#endif

#define TRANSFER_FROM_TRAMPOLINE					\
extern int _write (int, const void *, unsigned);			\
									\
void									\
__trampoline_setup (short * addr, int size, int fnaddr, int sc)		\
{									\
  extern short __trampoline_template[];					\
  short * to = addr;							\
  short * from = &__trampoline_template[0];				\
  int i;								\
									\
  if (size < 20)							\
    {									\
      _write (2, "__trampoline_setup bad size\n",			\
	      sizeof ("__trampoline_setup bad size\n") - 1);		\
      exit (-1);							\
    }									\
									\
  to[0] = from[0];							\
  to[1] = (short)(fnaddr);						\
  to[2] = from[2];							\
  to[3] = (short)(sc);							\
  to[4] = from[4];							\
  to[5] = (short)(fnaddr >> 16);					\
  to[6] = from[6];							\
  to[7] = (short)(sc >> 16);						\
  to[8] = from[8];							\
  to[9] = from[9];							\
									\
  for (i = 0; i < 20; i++)						\
    __asm__ volatile ("dcf @(%0,%1)\n\tici @(%0,%1)" :: "r" (to), "r" (i)); \
}									\
									\
__asm__("\n"								\
	"\t.globl " TRAMPOLINE_TEMPLATE_NAME "\n"			\
	"\t.text\n"							\
	TRAMPOLINE_TEMPLATE_NAME ":\n"					\
	"\tsetlos #0, gr6\n"	/* jump register */			\
	"\tsetlos #0, gr7\n"	/* static chain */			\
	"\tsethi #0, gr6\n"						\
	"\tsethi #0, gr7\n"						\
	"\tjmpl @(gr0,gr6)\n");


/* Addressing Modes.  */

/* A C expression that is 1 if the RTX X is a constant which is a valid
   address.  On most machines, this can be defined as `CONSTANT_P (X)', but a
   few machines are more restrictive in which constant addresses are supported.

   `CONSTANT_P' accepts integer-values expressions whose values are not
   explicitly known, such as `symbol_ref', `label_ref', and `high' expressions
   and `const' arithmetic expressions, in addition to `const_int' and
   `const_double' expressions.  */
#define CONSTANT_ADDRESS_P(X) CONSTANT_P (X)

/* A number, the maximum number of registers that can appear in a valid memory
   address.  Note that it is up to you to specify a value equal to the maximum
   number that `GO_IF_LEGITIMATE_ADDRESS' would ever accept.  */
#define MAX_REGS_PER_ADDRESS 2

/* A C compound statement with a conditional `goto LABEL;' executed if X (an
   RTX) is a legitimate memory address on the target machine for a memory
   operand of mode MODE.

   It usually pays to define several simpler macros to serve as subroutines for
   this one.  Otherwise it may be too complicated to understand.

   This macro must exist in two variants: a strict variant and a non-strict
   one.  The strict variant is used in the reload pass.  It must be defined so
   that any pseudo-register that has not been allocated a hard register is
   considered a memory reference.  In contexts where some kind of register is
   required, a pseudo-register with no hard register must be rejected.

   The non-strict variant is used in other passes.  It must be defined to
   accept all pseudo-registers in every context where some kind of register is
   required.

   Compiler source files that want to use the strict variant of this macro
   define the macro `REG_OK_STRICT'.  You should use an `#ifdef REG_OK_STRICT'
   conditional to define the strict variant in that case and the non-strict
   variant otherwise.

   Subroutines to check for acceptable registers for various purposes (one for
   base registers, one for index registers, and so on) are typically among the
   subroutines used to define `GO_IF_LEGITIMATE_ADDRESS'.  Then only these
   subroutine macros need have two variants; the higher levels of macros may be
   the same whether strict or not.

   Normally, constant addresses which are the sum of a `symbol_ref' and an
   integer are stored inside a `const' RTX to mark them as constant.
   Therefore, there is no need to recognize such sums specifically as
   legitimate addresses.  Normally you would simply recognize any `const' as
   legitimate.

   Usually `PRINT_OPERAND_ADDRESS' is not prepared to handle constant sums that
   are not marked with `const'.  It assumes that a naked `plus' indicates
   indexing.  If so, then you *must* reject such naked constant sums as
   illegitimate addresses, so that none of them will be given to
   `PRINT_OPERAND_ADDRESS'.

   On some machines, whether a symbolic address is legitimate depends on the
   section that the address refers to.  On these machines, define the macro
   `ENCODE_SECTION_INFO' to store the information into the `symbol_ref', and
   then check for it here.  When you see a `const', you will have to look
   inside it to find the `symbol_ref' in order to determine the section.

   The best way to modify the name string is by adding text to the beginning,
   with suitable punctuation to prevent any ambiguity.  Allocate the new name
   in `saveable_obstack'.  You will have to modify `ASM_OUTPUT_LABELREF' to
   remove and decode the added text and output the name accordingly, and define
   `(* targetm.strip_name_encoding)' to access the original name string.

   You can check the information stored here into the `symbol_ref' in the
   definitions of the macros `GO_IF_LEGITIMATE_ADDRESS' and
   `PRINT_OPERAND_ADDRESS'.  */

#ifdef REG_OK_STRICT
#define REG_OK_STRICT_P 1
#else
#define REG_OK_STRICT_P 0
#endif

#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, LABEL)			\
  do									\
    {									\
      if (frv_legitimate_address_p (MODE, X, REG_OK_STRICT_P, FALSE))	\
	goto LABEL;							\
    }									\
  while (0)

/* A C expression that is nonzero if X (assumed to be a `reg' RTX) is valid for
   use as a base register.  For hard registers, it should always accept those
   which the hardware permits and reject the others.  Whether the macro accepts
   or rejects pseudo registers must be controlled by `REG_OK_STRICT' as
   described above.  This usually requires two variant definitions, of which
   `REG_OK_STRICT' controls the one actually used.  */
#ifdef REG_OK_STRICT
#define REG_OK_FOR_BASE_P(X) GPR_P (REGNO (X))
#else
#define REG_OK_FOR_BASE_P(X) GPR_AP_OR_PSEUDO_P (REGNO (X))
#endif

/* A C expression that is nonzero if X (assumed to be a `reg' RTX) is valid for
   use as an index register.

   The difference between an index register and a base register is that the
   index register may be scaled.  If an address involves the sum of two
   registers, neither one of them scaled, then either one may be labeled the
   "base" and the other the "index"; but whichever labeling is used must fit
   the machine's constraints of which registers may serve in each capacity.
   The compiler will try both labelings, looking for one that is valid, and
   will reload one or both registers only if neither labeling works.  */
#define REG_OK_FOR_INDEX_P(X) REG_OK_FOR_BASE_P (X)

/* A C compound statement that attempts to replace X with a valid memory
   address for an operand of mode MODE.  WIN will be a C statement label
   elsewhere in the code; the macro definition may use

        GO_IF_LEGITIMATE_ADDRESS (MODE, X, WIN);

   to avoid further processing if the address has become legitimate.

   X will always be the result of a call to `break_out_memory_refs', and OLDX
   will be the operand that was given to that function to produce X.

   The code generated by this macro should not alter the substructure of X.  If
   it transforms X into a more legitimate form, it should assign X (which will
   always be a C variable) a new value.

   It is not necessary for this macro to come up with a legitimate address.
   The compiler has standard ways of doing so in all cases.  In fact, it is
   safe for this macro to do nothing.  But often a machine-dependent strategy
   can generate better code.  */

/* On the FRV, we use it to convert small data and pic references into using
   the appropriate pointer in the address.  */
#define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN)			\
  do								\
    {								\
      rtx newx = frv_legitimize_address (X, OLDX, MODE);	\
								\
      if (newx)							\
	{							\
	  (X) = newx;						\
	  goto WIN;						\
	}							\
    }								\
  while (0)

/* A C statement or compound statement with a conditional `goto LABEL;'
   executed if memory address X (an RTX) can have different meanings depending
   on the machine mode of the memory reference it is used for or if the address
   is valid for some modes but not others.

   Autoincrement and autodecrement addresses typically have mode-dependent
   effects because the amount of the increment or decrement is the size of the
   operand being addressed.  Some machines have other mode-dependent addresses.
   Many RISC machines have no mode-dependent addresses.

   You may assume that ADDR is a valid address for the machine.  */
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)

/* A C expression that is nonzero if X is a legitimate constant for an
   immediate operand on the target machine.  You can assume that X satisfies
   `CONSTANT_P', so you need not check this.  In fact, `1' is a suitable
   definition for this macro on machines where anything `CONSTANT_P' is valid.  */
#define LEGITIMATE_CONSTANT_P(X) frv_legitimate_constant_p (X)

/* The load-and-update commands allow pre-modification in addresses.
   The index has to be in a register.  */
#define HAVE_PRE_MODIFY_REG 1


/* Returns a mode from class `MODE_CC' to be used when comparison operation
   code OP is applied to rtx X and Y.  For example, on the SPARC,
   `SELECT_CC_MODE' is defined as (see *note Jump Patterns::.  for a
   description of the reason for this definition)

        #define SELECT_CC_MODE(OP,X,Y) \
          (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT          \
           ? ((OP == EQ || OP == NE) ? CCFPmode : CCFPEmode)    \
           : ((GET_CODE (X) == PLUS || GET_CODE (X) == MINUS    \
               || GET_CODE (X) == NEG) \
              ? CC_NOOVmode : CCmode))

   You need not define this macro if `EXTRA_CC_MODES' is not defined.  */
#define SELECT_CC_MODE(OP, X, Y)					\
  (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT				\
   ? CC_FPmode								\
   : (((OP) == LEU || (OP) == GTU || (OP) == LTU || (OP) == GEU)	\
      ? CC_UNSmode							\
      : CCmode))

/* A C expression whose value is one if it is always safe to reverse a
   comparison whose mode is MODE.  If `SELECT_CC_MODE' can ever return MODE for
   a floating-point inequality comparison, then `REVERSIBLE_CC_MODE (MODE)'
   must be zero.

   You need not define this macro if it would always returns zero or if the
   floating-point format is anything other than `IEEE_FLOAT_FORMAT'.  For
   example, here is the definition used on the SPARC, where floating-point
   inequality comparisons are always given `CCFPEmode':

        #define REVERSIBLE_CC_MODE(MODE)  ((MODE) != CCFPEmode)  */

/* On frv, don't consider floating point comparisons to be reversible.  In
   theory, fp equality comparisons can be reversible.  */
#define REVERSIBLE_CC_MODE(MODE) ((MODE) == CCmode || (MODE) == CC_UNSmode)

/* Frv CCR_MODE's are not reversible.  */
#define REVERSE_CONDEXEC_PREDICATES_P(x,y)      0


/* Describing Relative Costs of Operations.  */

/* A C expression for the cost of moving data from a register in class FROM to
   one in class TO.  The classes are expressed using the enumeration values
   such as `GENERAL_REGS'.  A value of 4 is the default; other values are
   interpreted relative to that.

   It is not required that the cost always equal 2 when FROM is the same as TO;
   on some machines it is expensive to move between registers if they are not
   general registers.

   If reload sees an insn consisting of a single `set' between two hard
   registers, and if `REGISTER_MOVE_COST' applied to their classes returns a
   value of 2, reload does not check to ensure that the constraints of the insn
   are met.  Setting a cost of other than 2 will allow reload to verify that
   the constraints are met.  You should do this if the `movM' pattern's
   constraints do not allow such copying.  */
#define REGISTER_MOVE_COST(MODE, FROM, TO) frv_register_move_cost (FROM, TO)

/* A C expression for the cost of moving data of mode M between a register and
   memory.  A value of 2 is the default; this cost is relative to those in
   `REGISTER_MOVE_COST'.

   If moving between registers and memory is more expensive than between two
   registers, you should define this macro to express the relative cost.  */
#define MEMORY_MOVE_COST(M,C,I) 4

/* A C expression for the cost of a branch instruction.  A value of 1 is the
   default; other values are interpreted relative to that.  */

/* Here are additional macros which do not specify precise relative costs, but
   only that certain actions are more expensive than GCC would ordinarily
   expect.  */

/* We used to default the branch cost to 2, but I changed it to 1, to avoid
   generating SCC instructions and or/and-ing them together, and then doing the
   branch on the result, which collectively generate much worse code.  */
#ifndef DEFAULT_BRANCH_COST
#define DEFAULT_BRANCH_COST 1
#endif

#define BRANCH_COST frv_branch_cost_int

/* Define this macro as a C expression which is nonzero if accessing less than
   a word of memory (i.e. a `char' or a `short') is no faster than accessing a
   word of memory, i.e., if such access require more than one instruction or if
   there is no difference in cost between byte and (aligned) word loads.

   When this macro is not defined, the compiler will access a field by finding
   the smallest containing object; when it is defined, a fullword load will be
   used if alignment permits.  Unless bytes accesses are faster than word
   accesses, using word accesses is preferable since it may eliminate
   subsequent memory access if subsequent accesses occur to other fields in the
   same word of the structure, but to different bytes.  */
#define SLOW_BYTE_ACCESS 1

/* Define this macro if it is as good or better to call a constant function
   address than to call an address kept in a register.  */
#define NO_FUNCTION_CSE

/* Define this macro if it is as good or better for a function to call itself
   with an explicit address than to call an address kept in a register.  */
#define NO_RECURSIVE_FUNCTION_CSE


/* Dividing the output into sections.  */

/* A C expression whose value is a string containing the assembler operation
   that should precede instructions and read-only data.  Normally `".text"' is
   right.  */
#define TEXT_SECTION_ASM_OP "\t.text"

/* A C expression whose value is a string containing the assembler operation to
   identify the following data as writable initialized data.  Normally
   `".data"' is right.  */
#define DATA_SECTION_ASM_OP "\t.data"

/* If defined, a C expression whose value is a string containing the
   assembler operation to identify the following data as
   uninitialized global data.  If not defined, and neither
   `ASM_OUTPUT_BSS' nor `ASM_OUTPUT_ALIGNED_BSS' are defined,
   uninitialized global data will be output in the data section if
   `-fno-common' is passed, otherwise `ASM_OUTPUT_COMMON' will be
   used.  */
#define BSS_SECTION_ASM_OP "\t.section .bss,\"aw\""

/* Short Data Support */
#define SDATA_SECTION_ASM_OP	"\t.section .sdata,\"aw\""

/* On svr4, we *do* have support for the .init and .fini sections, and we
   can put stuff in there to be executed before and after `main'.  We let
   crtstuff.c and other files know this by defining the following symbols.
   The definitions say how to change sections to the .init and .fini
   sections.  This is the same for all known svr4 assemblers.

   The standard System V.4 macros will work, but they look ugly in the
   assembly output, so redefine them.  */

#undef	INIT_SECTION_ASM_OP
#undef	FINI_SECTION_ASM_OP
#define INIT_SECTION_ASM_OP	"\t.section .init,\"ax\""
#define FINI_SECTION_ASM_OP	"\t.section .fini,\"ax\""

#undef CTORS_SECTION_ASM_OP
#undef DTORS_SECTION_ASM_OP
#define CTORS_SECTION_ASM_OP	"\t.section\t.ctors,\"a\""
#define DTORS_SECTION_ASM_OP	"\t.section\t.dtors,\"a\""

/* A C expression whose value is a string containing the assembler operation to
   switch to the fixup section that records all initialized pointers in a -fpic
   program so they can be changed program startup time if the program is loaded
   at a different address than linked for.  */
#define FIXUP_SECTION_ASM_OP	"\t.section .rofixup,\"a\""

/* A list of names for sections other than the standard two, which are
   `in_text' and `in_data'.  You need not define this macro
   on a system with no other sections (that GCC needs to use).  */
#undef  EXTRA_SECTIONS
#define EXTRA_SECTIONS in_sdata, in_const, in_fixup

/* One or more functions to be defined in "varasm.c".  These
   functions should do jobs analogous to those of `text_section' and
   `data_section', for your additional sections.  Do not define this
   macro if you do not define `EXTRA_SECTIONS'.  */
#undef  EXTRA_SECTION_FUNCTIONS
#define EXTRA_SECTION_FUNCTIONS                                         \
	SDATA_SECTION_FUNCTION						\
	FIXUP_SECTION_FUNCTION

#define SDATA_SECTION_FUNCTION						\
void									\
sdata_section (void)							\
{									\
  if (in_section != in_sdata)						\
    {									\
      fprintf (asm_out_file, "%s\n", SDATA_SECTION_ASM_OP);		\
      in_section = in_sdata;						\
    }									\
}

#define FIXUP_SECTION_FUNCTION						\
void									\
fixup_section (void)							\
{									\
  if (in_section != in_fixup)						\
    {									\
      fprintf (asm_out_file, "%s\n", FIXUP_SECTION_ASM_OP);		\
      in_section = in_fixup;						\
    }									\
}

/* Position Independent Code.  */

/* A C expression that is nonzero if X is a legitimate immediate operand on the
   target machine when generating position independent code.  You can assume
   that X satisfies `CONSTANT_P', so you need not check this.  You can also
   assume FLAG_PIC is true, so you need not check it either.  You need not
   define this macro if all constants (including `SYMBOL_REF') can be immediate
   operands when generating position independent code.  */
#define LEGITIMATE_PIC_OPERAND_P(X)					\
  (   GET_CODE (X) == CONST_INT						\
   || GET_CODE (X) == CONST_DOUBLE					\
   || (GET_CODE (X) == HIGH && GET_CODE (XEXP (X, 0)) == CONST_INT)	\
   || GET_CODE (X) == CONSTANT_P_RTX)


/* The Overall Framework of an Assembler File.  */

/* A C string constant describing how to begin a comment in the target
   assembler language.  The compiler assumes that the comment will end at the
   end of the line.  */
#define ASM_COMMENT_START ";"

/* A C string constant for text to be output before each `asm' statement or
   group of consecutive ones.  Normally this is `"#APP"', which is a comment
   that has no effect on most assemblers but tells the GNU assembler that it
   must check the lines that follow for all valid assembler constructs.  */
#define ASM_APP_ON "#APP\n"

/* A C string constant for text to be output after each `asm' statement or
   group of consecutive ones.  Normally this is `"#NO_APP"', which tells the
   GNU assembler to resume making the time-saving assumptions that are valid
   for ordinary compiler output.  */
#define ASM_APP_OFF "#NO_APP\n"


/* Output of Data.  */

/* This is how to output a label to dwarf/dwarf2.  */
#define ASM_OUTPUT_DWARF_ADDR(STREAM, LABEL)				\
do {									\
  fprintf (STREAM, "\t.picptr\t");					\
  assemble_name (STREAM, LABEL);					\
} while (0)

/* Whether to emit the gas specific dwarf2 line number support.  */
#define DWARF2_ASM_LINE_DEBUG_INFO (TARGET_DEBUG_LOC)

/* Output of Uninitialized Variables.  */

/* A C statement (sans semicolon) to output to the stdio stream STREAM the
   assembler definition of a local-common-label named NAME whose size is SIZE
   bytes.  The variable ROUNDED is the size rounded up to whatever alignment
   the caller wants.

   Use the expression `assemble_name (STREAM, NAME)' to output the name itself;
   before and after that, output the additional assembler syntax for defining
   the name, and a newline.

   This macro controls how the assembler definitions of uninitialized static
   variables are output.  */
#undef ASM_OUTPUT_LOCAL

/* Like `ASM_OUTPUT_LOCAL' except takes the required alignment as a separate,
   explicit argument.  If you define this macro, it is used in place of
   `ASM_OUTPUT_LOCAL', and gives you more flexibility in handling the required
   alignment of the variable.  The alignment is specified as the number of
   bits.

   Defined in svr4.h.  */
#undef ASM_OUTPUT_ALIGNED_LOCAL

/* This is for final.c, because it is used by ASM_DECLARE_OBJECT_NAME.  */
extern int size_directive_output;

/* Like `ASM_OUTPUT_ALIGNED_LOCAL' except that it takes an additional
   parameter - the DECL of variable to be output, if there is one.
   This macro can be called with DECL == NULL_TREE.  If you define
   this macro, it is used in place of `ASM_OUTPUT_LOCAL' and
   `ASM_OUTPUT_ALIGNED_LOCAL', and gives you more flexibility in
   handling the destination of the variable.  */
#undef ASM_OUTPUT_ALIGNED_DECL_LOCAL
#define ASM_OUTPUT_ALIGNED_DECL_LOCAL(STREAM, DECL, NAME, SIZE, ALIGN)	\
do {                                                                   	\
  if ((SIZE) > 0 && (SIZE) <= g_switch_value)				\
    named_section (0, ".sbss", 0);                                    	\
  else                                                                 	\
    bss_section ();                                                  	\
  ASM_OUTPUT_ALIGN (STREAM, floor_log2 ((ALIGN) / BITS_PER_UNIT));     	\
  ASM_DECLARE_OBJECT_NAME (STREAM, NAME, DECL);                        	\
  ASM_OUTPUT_SKIP (STREAM, (SIZE) ? (SIZE) : 1);                       	\
} while (0)


/* Output and Generation of Labels.  */

/* A C statement (sans semicolon) to output to the stdio stream STREAM the
   assembler definition of a label named NAME.  Use the expression
   `assemble_name (STREAM, NAME)' to output the name itself; before and after
   that, output the additional assembler syntax for defining the name, and a
   newline.  */
#define ASM_OUTPUT_LABEL(STREAM, NAME)					\
do {									\
  assemble_name (STREAM, NAME);						\
  fputs (":\n", STREAM);						\
} while (0)

/* Globalizing directive for a label.  */
#define GLOBAL_ASM_OP "\t.globl "

/* A C statement to store into the string STRING a label whose name is made
   from the string PREFIX and the number NUM.

   This string, when output subsequently by `assemble_name', should produce the
   output that `(*targetm.asm_out.internal_label)' would produce with the same PREFIX
   and NUM.

   If the string begins with `*', then `assemble_name' will output the rest of
   the string unchanged.  It is often convenient for
   `ASM_GENERATE_INTERNAL_LABEL' to use `*' in this way.  If the string doesn't
   start with `*', then `ASM_OUTPUT_LABELREF' gets to output the string, and
   may change it.  (Of course, `ASM_OUTPUT_LABELREF' is also part of your
   machine description, so you should know what it does on your machine.)

   Defined in svr4.h.  */
#undef ASM_GENERATE_INTERNAL_LABEL
#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM)			\
do {									\
  sprintf (LABEL, "*.%s%ld", PREFIX, (long)NUM);			\
} while (0)


/* Macros Controlling Initialization Routines.  */

/* If defined, a C string constant for the assembler operation to identify the
   following data as initialization code.  If not defined, GCC will assume
   such a section does not exist.  When you are using special sections for
   initialization and termination functions, this macro also controls how
   `crtstuff.c' and `libgcc2.c' arrange to run the initialization functions.

   Defined in svr4.h.  */
#undef INIT_SECTION_ASM_OP

/* If defined, `main' will call `__main' despite the presence of
   `INIT_SECTION_ASM_OP'.  This macro should be defined for systems where the
   init section is not actually run automatically, but is still useful for
   collecting the lists of constructors and destructors.  */
#define INVOKE__main

/* Output of Assembler Instructions.  */

/* A C initializer containing the assembler's names for the machine registers,
   each one as a C string constant.  This is what translates register numbers
   in the compiler into assembler language.  */
#define REGISTER_NAMES							\
{									\
 "gr0",  "sp",   "fp",   "gr3",  "gr4",  "gr5",  "gr6",  "gr7",		\
  "gr8",  "gr9",  "gr10", "gr11", "gr12", "gr13", "gr14", "gr15",	\
  "gr16", "gr17", "gr18", "gr19", "gr20", "gr21", "gr22", "gr23",	\
  "gr24", "gr25", "gr26", "gr27", "gr28", "gr29", "gr30", "gr31",	\
  "gr32", "gr33", "gr34", "gr35", "gr36", "gr37", "gr38", "gr39",	\
  "gr40", "gr41", "gr42", "gr43", "gr44", "gr45", "gr46", "gr47",	\
  "gr48", "gr49", "gr50", "gr51", "gr52", "gr53", "gr54", "gr55",	\
  "gr56", "gr57", "gr58", "gr59", "gr60", "gr61", "gr62", "gr63",	\
									\
  "fr0",  "fr1",  "fr2",  "fr3",  "fr4",  "fr5",  "fr6",  "fr7",	\
  "fr8",  "fr9",  "fr10", "fr11", "fr12", "fr13", "fr14", "fr15",	\
  "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", "fr22", "fr23",	\
  "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", "fr30", "fr31",	\
  "fr32", "fr33", "fr34", "fr35", "fr36", "fr37", "fr38", "fr39",	\
  "fr40", "fr41", "fr42", "fr43", "fr44", "fr45", "fr46", "fr47",	\
  "fr48", "fr49", "fr50", "fr51", "fr52", "fr53", "fr54", "fr55",	\
  "fr56", "fr57", "fr58", "fr59", "fr60", "fr61", "fr62", "fr63",	\
									\
  "fcc0", "fcc1", "fcc2", "fcc3", "icc0", "icc1", "icc2", "icc3",	\
  "cc0",  "cc1",  "cc2",  "cc3",  "cc4",  "cc5",  "cc6",  "cc7",	\
  "acc0", "acc1", "acc2", "acc3", "acc4", "acc5", "acc6", "acc7",	\
  "accg0","accg1","accg2","accg3","accg4","accg5","accg6","accg7",	\
  "ap",   "lr",   "lcr"							\
}

/* Define this macro if you are using an unusual assembler that
   requires different names for the machine instructions.

   The definition is a C statement or statements which output an
   assembler instruction opcode to the stdio stream STREAM.  The
   macro-operand PTR is a variable of type `char *' which points to
   the opcode name in its "internal" form--the form that is written
   in the machine description.  The definition should output the
   opcode name to STREAM, performing any translation you desire, and
   increment the variable PTR to point at the end of the opcode so
   that it will not be output twice.

   In fact, your macro definition may process less than the entire
   opcode name, or more than the opcode name; but if you want to
   process text that includes `%'-sequences to substitute operands,
   you must take care of the substitution yourself.  Just be sure to
   increment PTR over whatever text should not be output normally.

   If you need to look at the operand values, they can be found as the
   elements of `recog_operand'.

   If the macro definition does nothing, the instruction is output in
   the usual way.  */

#define ASM_OUTPUT_OPCODE(STREAM, PTR)\
   (PTR) = frv_asm_output_opcode (STREAM, PTR)

/* If defined, a C statement to be executed just prior to the output
   of assembler code for INSN, to modify the extracted operands so
   they will be output differently.

   Here the argument OPVEC is the vector containing the operands
   extracted from INSN, and NOPERANDS is the number of elements of
   the vector which contain meaningful data for this insn.  The
   contents of this vector are what will be used to convert the insn
   template into assembler code, so you can change the assembler
   output by changing the contents of the vector.

   This macro is useful when various assembler syntaxes share a single
   file of instruction patterns; by defining this macro differently,
   you can cause a large class of instructions to be output
   differently (such as with rearranged operands).  Naturally,
   variations in assembler syntax affecting individual insn patterns
   ought to be handled by writing conditional output routines in
   those patterns.

   If this macro is not defined, it is equivalent to a null statement.  */

#define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS)\
  frv_final_prescan_insn (INSN, OPVEC, NOPERANDS)


/* A C compound statement to output to stdio stream STREAM the assembler syntax
   for an instruction operand X.  X is an RTL expression.

   CODE is a value that can be used to specify one of several ways of printing
   the operand.  It is used when identical operands must be printed differently
   depending on the context.  CODE comes from the `%' specification that was
   used to request printing of the operand.  If the specification was just
   `%DIGIT' then CODE is 0; if the specification was `%LTR DIGIT' then CODE is
   the ASCII code for LTR.

   If X is a register, this macro should print the register's name.  The names
   can be found in an array `reg_names' whose type is `char *[]'.  `reg_names'
   is initialized from `REGISTER_NAMES'.

   When the machine description has a specification `%PUNCT' (a `%' followed by
   a punctuation character), this macro is called with a null pointer for X and
   the punctuation character for CODE.  */
#define PRINT_OPERAND(STREAM, X, CODE) frv_print_operand (STREAM, X, CODE)

/* A C expression which evaluates to true if CODE is a valid punctuation
   character for use in the `PRINT_OPERAND' macro.  If
   `PRINT_OPERAND_PUNCT_VALID_P' is not defined, it means that no punctuation
   characters (except for the standard one, `%') are used in this way.  */
/* . == gr0
   # == hint operand -- always zero for now
   @ == small data base register (gr16)
   ~ == pic register (gr17)
   * == temporary integer CCR register (cr3)
   & == temporary integer ICC register (icc3)  */
#define PRINT_OPERAND_PUNCT_VALID_P(CODE)				\
((CODE) == '.' || (CODE) == '#' || (CODE) == '@' || (CODE) == '~'	\
 || (CODE) == '*' || (CODE) == '&')

/* A C compound statement to output to stdio stream STREAM the assembler syntax
   for an instruction operand that is a memory reference whose address is X.  X
   is an RTL expression.

   On some machines, the syntax for a symbolic address depends on the section
   that the address refers to.  On these machines, define the macro
   `ENCODE_SECTION_INFO' to store the information into the `symbol_ref', and
   then check for it here.

   This declaration must be present.  */
#define PRINT_OPERAND_ADDRESS(STREAM, X) frv_print_operand_address (STREAM, X)

/* If defined, C string expressions to be used for the `%R', `%L', `%U', and
   `%I' options of `asm_fprintf' (see `final.c').  These are useful when a
   single `md' file must support multiple assembler formats.  In that case, the
   various `tm.h' files can define these macros differently.

   USER_LABEL_PREFIX is defined in svr4.h.  */
#undef USER_LABEL_PREFIX
#define USER_LABEL_PREFIX ""
#define REGISTER_PREFIX ""
#define LOCAL_LABEL_PREFIX "."
#define IMMEDIATE_PREFIX "#"


/* Output of dispatch tables.  */

/* This macro should be provided on machines where the addresses in a dispatch
   table are relative to the table's own address.

   The definition should be a C statement to output to the stdio stream STREAM
   an assembler pseudo-instruction to generate a difference between two labels.
   VALUE and REL are the numbers of two internal labels.  The definitions of
   these labels are output using `(*targetm.asm_out.internal_label)', and they must be
   printed in the same way here.  For example,

        fprintf (STREAM, "\t.word L%d-L%d\n", VALUE, REL)  */
#define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM, BODY, VALUE, REL) \
fprintf (STREAM, "\t.word .L%d-.L%d\n", VALUE, REL)

/* This macro should be provided on machines where the addresses in a dispatch
   table are absolute.

   The definition should be a C statement to output to the stdio stream STREAM
   an assembler pseudo-instruction to generate a reference to a label.  VALUE
   is the number of an internal label whose definition is output using
   `(*targetm.asm_out.internal_label)'.  For example,

        fprintf (STREAM, "\t.word L%d\n", VALUE)  */
#define ASM_OUTPUT_ADDR_VEC_ELT(STREAM, VALUE) \
fprintf (STREAM, "\t.word .L%d\n", VALUE)

/* Define this if the label before a jump-table needs to be output specially.
   The first three arguments are the same as for `(*targetm.asm_out.internal_label)';
   the fourth argument is the jump-table which follows (a `jump_insn'
   containing an `addr_vec' or `addr_diff_vec').

   This feature is used on system V to output a `swbeg' statement for the
   table.

   If this macro is not defined, these labels are output with
   `(*targetm.asm_out.internal_label)'.

   Defined in svr4.h.  */
/* When generating embedded PIC or mips16 code we want to put the jump
   table in the .text section.  In all other cases, we want to put the
   jump table in the .rdata section.  Unfortunately, we can't use
   JUMP_TABLES_IN_TEXT_SECTION, because it is not conditional.
   Instead, we use ASM_OUTPUT_CASE_LABEL to switch back to the .text
   section if appropriate.  */

#undef  ASM_OUTPUT_CASE_LABEL
#define ASM_OUTPUT_CASE_LABEL(STREAM, PREFIX, NUM, TABLE)               \
do {                                                                    \
  if (flag_pic)                                                         \
    function_section (current_function_decl);                           \
  (*targetm.asm_out.internal_label) (STREAM, PREFIX, NUM);                      \
} while (0)

/* Define this to determine whether case statement labels are relative to
   the start of the case statement or not.  */

#define CASE_VECTOR_PC_RELATIVE (flag_pic)


/* Assembler Commands for Exception Regions.  */

/* Define this macro to 0 if your target supports DWARF 2 frame unwind
   information, but it does not yet work with exception handling.  Otherwise,
   if your target supports this information (if it defines
   `INCOMING_RETURN_ADDR_RTX' and either `UNALIGNED_INT_ASM_OP' or
   `OBJECT_FORMAT_ELF'), GCC will provide a default definition of 1.

   If this macro is defined to 1, the DWARF 2 unwinder will be the default
   exception handling mechanism; otherwise, setjmp/longjmp will be used by
   default.

   If this macro is defined to anything, the DWARF 2 unwinder will be used
   instead of inline unwinders and __unwind_function in the non-setjmp case.  */
#define DWARF2_UNWIND_INFO 1

#define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (LR_REGNO)

/* Assembler Commands for Alignment.  */

/* A C statement to output to the stdio stream STREAM an assembler instruction
   to advance the location counter by NBYTES bytes.  Those bytes should be zero
   when loaded.  NBYTES will be a C expression of type `int'.

   Defined in svr4.h.  */
#undef  ASM_OUTPUT_SKIP
#define ASM_OUTPUT_SKIP(STREAM, NBYTES) \
  fprintf (STREAM, "\t.zero\t%u\n", (int)(NBYTES))

/* A C statement to output to the stdio stream STREAM an assembler command to
   advance the location counter to a multiple of 2 to the POWER bytes.  POWER
   will be a C expression of type `int'.  */
#define ASM_OUTPUT_ALIGN(STREAM, POWER) \
  fprintf ((STREAM), "\t.p2align %d\n", (POWER))

/* Inside the text section, align with unpacked nops rather than zeros.  */
#define ASM_OUTPUT_ALIGN_WITH_NOP(STREAM, POWER) \
  fprintf ((STREAM), "\t.p2alignl %d,0x80880000\n", (POWER))

/* Macros Affecting all Debug Formats.  */

/* A C expression that returns the DBX register number for the compiler
   register number REGNO.  In simple cases, the value of this expression may be
   REGNO itself.  But sometimes there are some registers that the compiler
   knows about and DBX does not, or vice versa.  In such cases, some register
   may need to have one number in the compiler and another for DBX.

   If two registers have consecutive numbers inside GCC, and they can be
   used as a pair to hold a multiword value, then they *must* have consecutive
   numbers after renumbering with `DBX_REGISTER_NUMBER'.  Otherwise, debuggers
   will be unable to access such a pair, because they expect register pairs to
   be consecutive in their own numbering scheme.

   If you find yourself defining `DBX_REGISTER_NUMBER' in way that does not
   preserve register pairs, then what you must do instead is redefine the
   actual register numbering scheme.

   This declaration is required.  */
#define DBX_REGISTER_NUMBER(REGNO) (REGNO)

/* A C expression that returns the type of debugging output GCC produces
   when the user specifies `-g' or `-ggdb'.  Define this if you have arranged
   for GCC to support more than one format of debugging output.  Currently,
   the allowable values are `DBX_DEBUG', `SDB_DEBUG', `DWARF_DEBUG',
   `DWARF2_DEBUG', and `XCOFF_DEBUG'.

   The value of this macro only affects the default debugging output; the user
   can always get a specific type of output by using `-gstabs', `-gcoff',
   `-gdwarf-1', `-gdwarf-2', or `-gxcoff'.

   Defined in svr4.h.  */
#undef  PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG

/* Miscellaneous Parameters.  */

/* Define this if you have defined special-purpose predicates in the file
   `MACHINE.c'.  This macro is called within an initializer of an array of
   structures.  The first field in the structure is the name of a predicate and
   the second field is an array of rtl codes.  For each predicate, list all rtl
   codes that can be in expressions matched by the predicate.  The list should
   have a trailing comma.  Here is an example of two entries in the list for a
   typical RISC machine:

        #define PREDICATE_CODES \
          {"gen_reg_rtx_operand", {SUBREG, REG}},  \
          {"reg_or_short_cint_operand", {SUBREG, REG, CONST_INT}},

   Defining this macro does not affect the generated code (however, incorrect
   definitions that omit an rtl code that may be matched by the predicate can
   cause the compiler to malfunction).  Instead, it allows the table built by
   `genrecog' to be more compact and efficient, thus speeding up the compiler.
   The most important predicates to include in the list specified by this macro
   are thoses used in the most insn patterns.  */
#define PREDICATE_CODES							\
  { "integer_register_operand",		{ REG, SUBREG }},		\
  { "frv_load_operand",			{ REG, SUBREG, MEM }},		\
  { "gpr_no_subreg_operand",		{ REG }},			\
  { "gpr_or_fpr_operand",		{ REG, SUBREG }},		\
  { "gpr_or_int12_operand",		{ REG, SUBREG, CONST_INT }},	\
  { "gpr_fpr_or_int12_operand",		{ REG, SUBREG, CONST_INT }},	\
  { "gpr_or_int10_operand",		{ REG, SUBREG, CONST_INT }},	\
  { "gpr_or_int_operand",		{ REG, SUBREG, CONST_INT }},	\
  { "move_source_operand",		{ REG, SUBREG, CONST_INT, MEM,	\
					  CONST_DOUBLE, CONST,		\
					  SYMBOL_REF, LABEL_REF }},	\
  { "move_destination_operand",		{ REG, SUBREG, MEM }},		\
  { "condexec_source_operand",		{ REG, SUBREG, CONST_INT, MEM,	\
					  CONST_DOUBLE }},		\
  { "condexec_dest_operand",		{ REG, SUBREG, MEM }},		\
  { "reg_or_0_operand",			{ REG, SUBREG, CONST_INT }},	\
  { "lr_operand",			{ REG }},			\
  { "gpr_or_memory_operand",		{ REG, SUBREG, MEM }},		\
  { "fpr_or_memory_operand",		{ REG, SUBREG, MEM }},		\
  { "int12_operand",			{ CONST_INT }},			\
  { "int_2word_operand",		{ CONST_INT, CONST_DOUBLE,	\
					  SYMBOL_REF, LABEL_REF, CONST }}, \
  { "pic_register_operand",		{ REG }},			\
  { "pic_symbolic_operand",		{ SYMBOL_REF, LABEL_REF, CONST }}, \
  { "small_data_register_operand",	{ REG }},			\
  { "small_data_symbolic_operand",	{ SYMBOL_REF, CONST }},		\
  { "icc_operand",			{ REG }},			\
  { "fcc_operand",			{ REG }},			\
  { "cc_operand",			{ REG }},			\
  { "icr_operand",			{ REG }},			\
  { "fcr_operand",			{ REG }},			\
  { "cr_operand",			{ REG }},			\
  { "fpr_operand",			{ REG, SUBREG }},		\
  { "even_reg_operand",			{ REG, SUBREG }},		\
  { "odd_reg_operand",			{ REG, SUBREG }},		\
  { "even_gpr_operand",			{ REG, SUBREG }},		\
  { "odd_gpr_operand",			{ REG, SUBREG }},		\
  { "quad_fpr_operand",			{ REG, SUBREG }},		\
  { "even_fpr_operand",			{ REG, SUBREG }},		\
  { "odd_fpr_operand",			{ REG, SUBREG }},		\
  { "dbl_memory_one_insn_operand",	{ MEM }},			\
  { "dbl_memory_two_insn_operand",	{ MEM }},			\
  { "call_operand",			{ REG, SUBREG, PLUS, CONST_INT,	\
					  SYMBOL_REF, LABEL_REF, CONST }}, \
  { "upper_int16_operand",		{ CONST_INT }},			\
  { "uint16_operand",			{ CONST_INT }},			\
  { "relational_operator",		{ EQ, NE, LE, LT, GE, GT,	\
					  LEU, LTU, GEU, GTU }},	\
  { "signed_relational_operator",	{ EQ, NE, LE, LT, GE, GT }},	\
  { "unsigned_relational_operator",	{ LEU, LTU, GEU, GTU }},	\
  { "float_relational_operator",	{ EQ, NE, LE, LT, GE, GT }},	\
  { "ccr_eqne_operator",		{ EQ, NE }},			\
  { "minmax_operator",			{ SMIN, SMAX, UMIN, UMAX }},	\
  { "condexec_si_binary_operator",	{ PLUS, MINUS, AND, IOR, XOR,	\
					  ASHIFT, ASHIFTRT, LSHIFTRT }}, \
  { "condexec_si_media_operator",	{ AND, IOR, XOR }},		\
  { "condexec_si_divide_operator",	{ DIV, UDIV }},			\
  { "condexec_si_unary_operator",	{ NOT, NEG }},			\
  { "condexec_sf_add_operator",		{ PLUS, MINUS }},		\
  { "condexec_sf_conv_operator",	{ ABS, NEG }},			\
  { "intop_compare_operator",		{ PLUS, MINUS, AND, IOR, XOR,	\
					  ASHIFT, ASHIFTRT, LSHIFTRT }}, \
  { "condexec_intop_cmp_operator",	{ PLUS, MINUS, AND, IOR, XOR,	\
					  ASHIFT, ASHIFTRT, LSHIFTRT }}, \
  { "fpr_or_int6_operand",		{ REG, SUBREG, CONST_INT }},	\
  { "int6_operand",			{ CONST_INT }},			\
  { "int5_operand",			{ CONST_INT }},			\
  { "uint5_operand",			{ CONST_INT }},			\
  { "uint4_operand",			{ CONST_INT }},			\
  { "uint1_operand",			{ CONST_INT }},			\
  { "acc_operand",			{ REG, SUBREG }},		\
  { "even_acc_operand",			{ REG, SUBREG }},		\
  { "quad_acc_operand",			{ REG, SUBREG }},		\
  { "accg_operand",			{ REG, SUBREG }},

/* An alias for a machine mode name.  This is the machine mode that elements of
   a jump-table should have.  */
#define CASE_VECTOR_MODE SImode

/* Define this macro if operations between registers with integral mode smaller
   than a word are always performed on the entire register.  Most RISC machines
   have this property and most CISC machines do not.  */
#define WORD_REGISTER_OPERATIONS

/* Define this macro to be a C expression indicating when insns that read
   memory in MODE, an integral mode narrower than a word, set the bits outside
   of MODE to be either the sign-extension or the zero-extension of the data
   read.  Return `SIGN_EXTEND' for values of MODE for which the insn
   sign-extends, `ZERO_EXTEND' for which it zero-extends, and `NIL' for other
   modes.

   This macro is not called with MODE non-integral or with a width greater than
   or equal to `BITS_PER_WORD', so you may return any value in this case.  Do
   not define this macro if it would always return `NIL'.  On machines where
   this macro is defined, you will normally define it as the constant
   `SIGN_EXTEND' or `ZERO_EXTEND'.  */
#define LOAD_EXTEND_OP(MODE) SIGN_EXTEND

/* Define if loading short immediate values into registers sign extends.  */
#define SHORT_IMMEDIATES_SIGN_EXTEND

/* The maximum number of bytes that a single instruction can move quickly from
   memory to memory.  */
#define MOVE_MAX 8

/* A C expression which is nonzero if on this machine it is safe to "convert"
   an integer of INPREC bits to one of OUTPREC bits (where OUTPREC is smaller
   than INPREC) by merely operating on it as if it had only OUTPREC bits.

   On many machines, this expression can be 1.

   When `TRULY_NOOP_TRUNCATION' returns 1 for a pair of sizes for modes for
   which `MODES_TIEABLE_P' is 0, suboptimal code can result.  If this is the
   case, making `TRULY_NOOP_TRUNCATION' return 0 in such cases may improve
   things.  */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1

/* An alias for the machine mode for pointers.  On most machines, define this
   to be the integer mode corresponding to the width of a hardware pointer;
   `SImode' on 32-bit machine or `DImode' on 64-bit machines.  On some machines
   you must define this to be one of the partial integer modes, such as
   `PSImode'.

   The width of `Pmode' must be at least as large as the value of
   `POINTER_SIZE'.  If it is not equal, you must define the macro
   `POINTERS_EXTEND_UNSIGNED' to specify how pointers are extended to `Pmode'.  */
#define Pmode SImode

/* An alias for the machine mode used for memory references to functions being
   called, in `call' RTL expressions.  On most machines this should be
   `QImode'.  */
#define FUNCTION_MODE QImode

/* Define this macro to handle System V style pragmas: #pragma pack and
   #pragma weak.  Note, #pragma weak will only be supported if SUPPORT_WEAK is
   defined.

   Defined in svr4.h.  */
#define HANDLE_SYSV_PRAGMA 1

/* A C expression for the maximum number of instructions to execute via
   conditional execution instructions instead of a branch.  A value of
   BRANCH_COST+1 is the default if the machine does not use
   cc0, and 1 if it does use cc0.  */
#define MAX_CONDITIONAL_EXECUTE frv_condexec_insns

/* Default value of MAX_CONDITIONAL_EXECUTE if no -mcond-exec-insns= */
#define DEFAULT_CONDEXEC_INSNS 8

/* A C expression to modify the code described by the conditional if
   information CE_INFO, possibly updating the tests in TRUE_EXPR, and
   FALSE_EXPR for converting if-then and if-then-else code to conditional
   instructions.  Set either TRUE_EXPR or FALSE_EXPR to a null pointer if the
   tests cannot be converted.  */
#define IFCVT_MODIFY_TESTS(CE_INFO, TRUE_EXPR, FALSE_EXPR)		\
frv_ifcvt_modify_tests (CE_INFO, &TRUE_EXPR, &FALSE_EXPR)

/* A C expression to modify the code described by the conditional if
   information CE_INFO, for the basic block BB, possibly updating the tests in
   TRUE_EXPR, and FALSE_EXPR for converting the && and || parts of if-then or
   if-then-else code to conditional instructions.  OLD_TRUE and OLD_FALSE are
   the previous tests.  Set either TRUE_EXPR or FALSE_EXPR to a null pointer if
   the tests cannot be converted.  */
#define IFCVT_MODIFY_MULTIPLE_TESTS(CE_INFO, BB, TRUE_EXPR, FALSE_EXPR) \
frv_ifcvt_modify_multiple_tests (CE_INFO, BB, &TRUE_EXPR, &FALSE_EXPR)

/* A C expression to modify the code described by the conditional if
   information CE_INFO with the new PATTERN in INSN.  If PATTERN is a null
   pointer after the IFCVT_MODIFY_INSN macro executes, it is assumed that that
   insn cannot be converted to be executed conditionally.  */
#define IFCVT_MODIFY_INSN(CE_INFO, PATTERN, INSN) \
(PATTERN) = frv_ifcvt_modify_insn (CE_INFO, PATTERN, INSN)

/* A C expression to perform any final machine dependent modifications in
   converting code to conditional execution in the code described by the
   conditional if information CE_INFO.  */
#define IFCVT_MODIFY_FINAL(CE_INFO) frv_ifcvt_modify_final (CE_INFO)

/* A C expression to cancel any machine dependent modifications in converting
   code to conditional execution in the code described by the conditional if
   information CE_INFO.  */
#define IFCVT_MODIFY_CANCEL(CE_INFO) frv_ifcvt_modify_cancel (CE_INFO)

/* Initialize the extra fields provided by IFCVT_EXTRA_FIELDS.  */
#define IFCVT_INIT_EXTRA_FIELDS(CE_INFO) frv_ifcvt_init_extra_fields (CE_INFO)

/* Indicate how many instructions can be issued at the same time.  */
#define ISSUE_RATE							\
(! TARGET_PACK ? 1							\
 : (frv_cpu_type == FRV_CPU_GENERIC					\
    || frv_cpu_type == FRV_CPU_FR500					\
    || frv_cpu_type == FRV_CPU_TOMCAT) ? 4				\
 : frv_cpu_type == FRV_CPU_FR400 ? 2 : 1)

/* Set and clear whether this insn begins a VLIW insn.  */
#define CLEAR_VLIW_START(INSN) PUT_MODE (INSN, VOIDmode)
#define SET_VLIW_START(INSN) PUT_MODE (INSN, TImode)

/* The definition of the following macro results in that the 2nd jump
   optimization (after the 2nd insn scheduling) is minimal.  It is
   necessary to define when start cycle marks of insns (TImode is used
   for this) is used for VLIW insn packing.  Some jump optimizations
   make such marks invalid.  These marks are corrected for some
   (minimal) optimizations.  ??? Probably the macro is temporary.
   Final solution could making the 2nd jump optimizations before the
   2nd instruction scheduling or corrections of the marks for all jump
   optimizations.  Although some jump optimizations are actually
   deoptimizations for VLIW (super-scalar) processors.  */

#define MINIMAL_SECOND_JUMP_OPTIMIZATION

/* Return true if parallel operations are expected to be emitted via the
   packing flag.  */
#define PACKING_FLAG_USED_P() \
(optimize && flag_schedule_insns_after_reload && ISSUE_RATE > 1)

/* If the following macro is defined and nonzero and deterministic
   finite state automata are used for pipeline hazard recognition, the
   code making resource-constrained software pipelining is on.  */
#define RCSP_SOFTWARE_PIPELINING 1

/* If the following macro is defined and nonzero and deterministic
   finite state automata are used for pipeline hazard recognition, we
   will try to exchange insns in queue ready to improve the schedule.
   The more macro value, the more tries will be made.  */
#define FIRST_CYCLE_MULTIPASS_SCHEDULING 1

/* The following macro is used only when value of
   FIRST_CYCLE_MULTIPASS_SCHEDULING is nonzero.  The more macro value,
   the more tries will be made to choose better schedule.  If the
   macro value is zero or negative there will be no multi-pass
   scheduling.  */
#define FIRST_CYCLE_MULTIPASS_SCHEDULING_LOOKAHEAD frv_sched_lookahead

enum frv_builtins
{
  FRV_BUILTIN_MAND,
  FRV_BUILTIN_MOR,
  FRV_BUILTIN_MXOR,
  FRV_BUILTIN_MNOT,
  FRV_BUILTIN_MAVEH,
  FRV_BUILTIN_MSATHS,
  FRV_BUILTIN_MSATHU,
  FRV_BUILTIN_MADDHSS,
  FRV_BUILTIN_MADDHUS,
  FRV_BUILTIN_MSUBHSS,
  FRV_BUILTIN_MSUBHUS,
  FRV_BUILTIN_MPACKH,
  FRV_BUILTIN_MQADDHSS,
  FRV_BUILTIN_MQADDHUS,
  FRV_BUILTIN_MQSUBHSS,
  FRV_BUILTIN_MQSUBHUS,
  FRV_BUILTIN_MUNPACKH,
  FRV_BUILTIN_MDPACKH,
  FRV_BUILTIN_MBTOH,
  FRV_BUILTIN_MHTOB,
  FRV_BUILTIN_MCOP1,
  FRV_BUILTIN_MCOP2,
  FRV_BUILTIN_MROTLI,
  FRV_BUILTIN_MROTRI,
  FRV_BUILTIN_MWCUT,
  FRV_BUILTIN_MSLLHI,
  FRV_BUILTIN_MSRLHI,
  FRV_BUILTIN_MSRAHI,
  FRV_BUILTIN_MEXPDHW,
  FRV_BUILTIN_MEXPDHD,
  FRV_BUILTIN_MMULHS,
  FRV_BUILTIN_MMULHU,
  FRV_BUILTIN_MMULXHS,
  FRV_BUILTIN_MMULXHU,
  FRV_BUILTIN_MMACHS,
  FRV_BUILTIN_MMACHU,
  FRV_BUILTIN_MMRDHS,
  FRV_BUILTIN_MMRDHU,
  FRV_BUILTIN_MQMULHS,
  FRV_BUILTIN_MQMULHU,
  FRV_BUILTIN_MQMULXHU,
  FRV_BUILTIN_MQMULXHS,
  FRV_BUILTIN_MQMACHS,
  FRV_BUILTIN_MQMACHU,
  FRV_BUILTIN_MCPXRS,
  FRV_BUILTIN_MCPXRU,
  FRV_BUILTIN_MCPXIS,
  FRV_BUILTIN_MCPXIU,
  FRV_BUILTIN_MQCPXRS,
  FRV_BUILTIN_MQCPXRU,
  FRV_BUILTIN_MQCPXIS,
  FRV_BUILTIN_MQCPXIU,
  FRV_BUILTIN_MCUT,
  FRV_BUILTIN_MCUTSS,
  FRV_BUILTIN_MWTACC,
  FRV_BUILTIN_MWTACCG,
  FRV_BUILTIN_MRDACC,
  FRV_BUILTIN_MRDACCG,
  FRV_BUILTIN_MTRAP,
  FRV_BUILTIN_MCLRACC,
  FRV_BUILTIN_MCLRACCA,
  FRV_BUILTIN_MDUNPACKH,
  FRV_BUILTIN_MBTOHE,
  FRV_BUILTIN_MQXMACHS,
  FRV_BUILTIN_MQXMACXHS,
  FRV_BUILTIN_MQMACXHS,
  FRV_BUILTIN_MADDACCS,
  FRV_BUILTIN_MSUBACCS,
  FRV_BUILTIN_MASACCS,
  FRV_BUILTIN_MDADDACCS,
  FRV_BUILTIN_MDSUBACCS,
  FRV_BUILTIN_MDASACCS,
  FRV_BUILTIN_MABSHS,
  FRV_BUILTIN_MDROTLI,
  FRV_BUILTIN_MCPLHI,
  FRV_BUILTIN_MCPLI,
  FRV_BUILTIN_MDCUTSSI,
  FRV_BUILTIN_MQSATHS,
  FRV_BUILTIN_MHSETLOS,
  FRV_BUILTIN_MHSETLOH,
  FRV_BUILTIN_MHSETHIS,
  FRV_BUILTIN_MHSETHIH,
  FRV_BUILTIN_MHDSETS,
  FRV_BUILTIN_MHDSETH
};

/* Enable prototypes on the call rtl functions.  */
#define MD_CALL_PROTOTYPES 1

extern GTY(()) rtx frv_compare_op0;			/* operand save for */
extern GTY(()) rtx frv_compare_op1;			/* comparison generation */

#endif /* __FRV_H__ */
