OSDN Git Service

* MAINTAINERS (crx port, m68hc11 port): Remove. Move maintainers
authorjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Mar 2011 19:58:18 +0000 (19:58 +0000)
committerjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Mar 2011 19:58:18 +0000 (19:58 +0000)
to Write After Approval.
* config-ml.in: Don't handle arc-*-elf*.
* configure.ac (arc-*-*, crx-*-*, i[[3456789]]86-*-pe,
m68hc11-*-*|m6811-*-*|m68hc12-*-*|m6812-*-*, mcore-*-pe*): Don't
handle GCC libraries.
* configure: Regenerate.

contrib:
* compare-all-tests (all_targets): Remove crx and m68hc11.

fixincludes:
* mkfixinc.sh: Don't handle i?86-moss-msdos* or i?86-*-pe.

gcc:
* config/alpha/gnu.h: Remove.
* config/arc: Remove directory.
* config/arm/netbsd.h: Remove.
* config/arm/t-pe: Remove.
* config/crx: Remove directory.
* config/i386/netbsd.h: Remove.
* config/m68hc11: Remove directory.
* config/m68k/uclinux-oldabi.h: Remove.
* config/mcore/mcore-pe.h: Remove.
* config/mcore/t-mcore-pe: Remove.
* config/netbsd-aout.h: Remove.
* config/rs6000/gnu.h: Remove.
* config/sh/sh-symbian.h: Remove.
* config/sh/symbian-base.c: Remove.
* config/sh/symbian-c.c: Remove.
* config/sh/symbian-cxx.c: Remove.
* config/sh/symbian-post.h: Remove.
* config/sh/symbian-pre.h: Remove.
* config/sh/t-symbian: Remove.
* config/svr3.h: Remove.
* config/vax/netbsd.h: Remove.
* config.build: Don't handle i[34567]86-*-pe.
* config.gcc: Remove handling of deprecations for most deprecated
targets.
(m68k-*-uclinuxoldabi*): Add to second deprecated list.
(alpha*-*-gnu*, arc-*-elf*, arm*-*-netbsd*, arm-*-pe*, crx-*-elf,
i[34567]86-*-netbsd*, i[34567]86-*-pe, m68hc11-*-*|m6811-*-*,
m68hc12-*-*|m6812-*-*, m68k-*-uclinuxoldabi*, mcore-*-pe*,
powerpc64-*-gnu*, powerpc-*-gnu-gnualtivec*, powerpc-*-gnu*,
sh-*-symbianelf* | sh[12346l]*-*-symbianelf*, vax-*-netbsd*):
Remove cases.
* config.host: Don't handle i[34567]86-*-pe.
* config/rs6000/linux64.h (LINK_OS_GNU_SPEC): Remove.
(ASM_SPEC32): Don't handle -mcall-gnu.
* config/rs6000/sysv4.h (SUBTARGET_OVERRIDE_OPTIONS): Don't handle
-mcall-gnu.
(ASM_SPEC, CC1_SPEC, LINK_START_SPEC, LINK_OS_SPEC, CPP_SPEC,
STARTFILE_SPEC, LIB_SPEC, ENDFILE_SPEC): Don't handle -mcall-gnu.
(LIB_GNU_SPEC, STARTFILE_GNU_SPEC, ENDFILE_GNU_SPEC,
LINK_START_GNU_SPEC, LINK_OS_GNU_SPEC, CPP_OS_GNU_SPEC): Remove.
(SUBTARGET_EXTRA_SPECS): Remove *_gnu specs.
* config/sh/sh-protos.h, config/sh/sh.c: Remove all code
conditional on SYMBIAN.
* configure.ac: Don't handle powerpc*-*-gnu*.
* configure: Regenerate.
* doc/extend.texi (interrupt attribute): Don't mention CRX.
* doc/install-old.texi (m6811, m6812): Don't mention.
* doc/install.texi (arc-*-elf*): Don't document multilib option.
(arc-*-elf, CRX, m6811-elf, m6812-elf): Remove.
(m68k-uclinuxoldabi): Don't mention.
* doc/invoke.texi (ARC Options, CRX Options, M68hc1x Options):
Remove.
(-mcall-gnu): Remove.
* doc/md.texi (CRX Architecture, Motorola 68HC11 & 68HC12
families): Remove constraint documentation.

gcc/testsuite:
* gcc.c-torture/execute/920501-8.x: Remove.
* gcc.c-torture/execute/930513-1.x: Remove.
* gcc.c-torture/execute/960312-1.x: Remove.
* gcc.c-torture/compile/20000804-1.c,
gcc.c-torture/compile/20001205-1.c,
gcc.c-torture/compile/20001226-1.c,
gcc.c-torture/compile/20010518-2.c,
gcc.c-torture/compile/20020312-1.c,
gcc.c-torture/compile/20020604-1.c,
gcc.c-torture/compile/920501-12.c,
gcc.c-torture/compile/920501-4.c,
gcc.c-torture/compile/920520-1.c,
gcc.c-torture/compile/980506-1.c,
gcc.c-torture/execute/980709-1.x,
gcc.c-torture/execute/990826-0.x: Don't XFAIL or use special
options for m68hc11.
* gcc.dg/cpp/assert4.c: Don't handle ARC.
* gcc.dg/sibcall-3.c, gcc.dg/sibcall-4.c: Don't XFAIL for arc or
m68hc11.

libgcc:
* config.host (alpha*-*-gnu*, arc-*-elf*, arm*-*-netbsd*,
arm-*-pe*, crx-*-elf, i[34567]86-*-netbsd*, i[34567]86-*-pe,
m68hc11-*-*|m6811-*-*, m68hc12-*-*|m6812-*-*, mcore-*-pe*,
powerpc64-*-gnu*, powerpc-*-gnu-gnualtivec*, powerpc-*-gnu*,
sh-*-symbianelf* | sh[12346l]*-*-symbianelf*, vax-*-netbsd*):
Remove cases.

libstdc++-v3:
* configure.ac: Don't handle powerpc*-*-gnu*.
* configure: Regenerate.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@171302 138bc75d-0d04-0410-961f-82ee72b054a4

91 files changed:
ChangeLog
MAINTAINERS
config-ml.in
configure
configure.ac
contrib/ChangeLog
contrib/compare-all-tests
fixincludes/ChangeLog
fixincludes/mkfixinc.sh
gcc/ChangeLog
gcc/config.build
gcc/config.gcc
gcc/config.host
gcc/config/alpha/gnu.h [deleted file]
gcc/config/arc/arc-modes.def [deleted file]
gcc/config/arc/arc-protos.h [deleted file]
gcc/config/arc/arc.c [deleted file]
gcc/config/arc/arc.h [deleted file]
gcc/config/arc/arc.md [deleted file]
gcc/config/arc/arc.opt [deleted file]
gcc/config/arc/initfini.c [deleted file]
gcc/config/arc/lib1funcs.asm [deleted file]
gcc/config/arc/t-arc [deleted file]
gcc/config/arm/netbsd.h [deleted file]
gcc/config/arm/t-pe [deleted file]
gcc/config/crx/crx-protos.h [deleted file]
gcc/config/crx/crx.c [deleted file]
gcc/config/crx/crx.h [deleted file]
gcc/config/crx/crx.md [deleted file]
gcc/config/crx/crx.opt [deleted file]
gcc/config/crx/t-crx [deleted file]
gcc/config/i386/netbsd.h [deleted file]
gcc/config/m68hc11/larith.asm [deleted file]
gcc/config/m68hc11/m68hc11-crt0.S [deleted file]
gcc/config/m68hc11/m68hc11-protos.h [deleted file]
gcc/config/m68hc11/m68hc11.c [deleted file]
gcc/config/m68hc11/m68hc11.h [deleted file]
gcc/config/m68hc11/m68hc11.md [deleted file]
gcc/config/m68hc11/m68hc11.opt [deleted file]
gcc/config/m68hc11/m68hc12.h [deleted file]
gcc/config/m68hc11/predicates.md [deleted file]
gcc/config/m68hc11/t-m68hc11 [deleted file]
gcc/config/m68k/uclinux-oldabi.h [deleted file]
gcc/config/mcore/mcore-pe.h [deleted file]
gcc/config/mcore/t-mcore-pe [deleted file]
gcc/config/netbsd-aout.h [deleted file]
gcc/config/rs6000/gnu.h [deleted file]
gcc/config/rs6000/linux64.h
gcc/config/rs6000/sysv4.h
gcc/config/sh/sh-protos.h
gcc/config/sh/sh-symbian.h [deleted file]
gcc/config/sh/sh.c
gcc/config/sh/symbian-base.c [deleted file]
gcc/config/sh/symbian-c.c [deleted file]
gcc/config/sh/symbian-cxx.c [deleted file]
gcc/config/sh/symbian-post.h [deleted file]
gcc/config/sh/symbian-pre.h [deleted file]
gcc/config/sh/t-symbian [deleted file]
gcc/config/svr3.h [deleted file]
gcc/config/vax/netbsd.h [deleted file]
gcc/configure
gcc/configure.ac
gcc/doc/extend.texi
gcc/doc/install-old.texi
gcc/doc/install.texi
gcc/doc/invoke.texi
gcc/doc/md.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20000804-1.c
gcc/testsuite/gcc.c-torture/compile/20001205-1.c
gcc/testsuite/gcc.c-torture/compile/20001226-1.c
gcc/testsuite/gcc.c-torture/compile/20010518-2.c
gcc/testsuite/gcc.c-torture/compile/20020312-1.c
gcc/testsuite/gcc.c-torture/compile/20020604-1.c
gcc/testsuite/gcc.c-torture/compile/920501-12.c
gcc/testsuite/gcc.c-torture/compile/920501-4.c
gcc/testsuite/gcc.c-torture/compile/920520-1.c
gcc/testsuite/gcc.c-torture/compile/980506-1.c
gcc/testsuite/gcc.c-torture/execute/920501-8.x [deleted file]
gcc/testsuite/gcc.c-torture/execute/930513-1.x [deleted file]
gcc/testsuite/gcc.c-torture/execute/960312-1.x [deleted file]
gcc/testsuite/gcc.c-torture/execute/980709-1.x
gcc/testsuite/gcc.c-torture/execute/990826-0.x
gcc/testsuite/gcc.dg/cpp/assert4.c
gcc/testsuite/gcc.dg/sibcall-3.c
gcc/testsuite/gcc.dg/sibcall-4.c
libgcc/ChangeLog
libgcc/config.host
libstdc++-v3/ChangeLog
libstdc++-v3/configure
libstdc++-v3/configure.ac

index 011b796..364465c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2011-03-22  Joseph Myers  <joseph@codesourcery.com>
+
+       * MAINTAINERS (crx port, m68hc11 port): Remove.  Move maintainers
+       to Write After Approval.
+       * config-ml.in: Don't handle arc-*-elf*.
+       * configure.ac (arc-*-*, crx-*-*, i[[3456789]]86-*-pe,
+       m68hc11-*-*|m6811-*-*|m68hc12-*-*|m6812-*-*, mcore-*-pe*): Don't
+       handle GCC libraries.
+       * configure: Regenerate.
+
 2011-03-21  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        PR bootstrap/48120:
index 27bb91a..5d5a96a 100644 (file)
@@ -51,7 +51,6 @@ avr port              Eric Weddington         eric.weddington@atmel.com
 bfin port              Bernd Schmidt           bernds@codesourcery.com
 bfin port              Jie Zhang               jie@codesourcery.com
 cris port              Hans-Peter Nilsson      hp@axis.com
-crx port               Pompapathi V Gadad      Pompapathi.V.Gadad@nsc.com
 fr30 port              Nick Clifton            nickc@redhat.com
 frv port               Nick Clifton            nickc@redhat.com
 frv port               Alexandre Oliva         aoliva@redhat.com
@@ -68,7 +67,6 @@ iq2000 port           Nick Clifton            nickc@redhat.com
 lm32 port              Sebastien Bourdeauducq  sebastien@milkymist.org
 m32c port              DJ Delorie              dj@redhat.com
 m32r port              Nick Clifton            nickc@redhat.com
-m68hc11 port           Stephane Carrez         stcarrez@nerim.fr
 m68k port (?)          Jeff Law                law@redhat.com
 m68k port              Andreas Schwab          schwab@linux-m68k.org
 m68k-motorola-sysv port        Philippe De Muyter      phdm@macqel.be
@@ -326,6 +324,7 @@ Julian Brown                                        julian@codesourcery.com
 Christian Bruel                                        christian.bruel@st.com
 Kevin Buettner                                 kevinb@redhat.com
 Andrew Cagney                                  cagney@redhat.com
+Stephane Carrez                                        stcarrez@nerim.fr
 Chandra Chavva                                 cchavva@redhat.com
 Fabien ChĂȘne                                   fabien@gcc.gnu.org
 William Cohen                                  wcohen@redhat.com
@@ -357,6 +356,7 @@ John Freeman                                        jfreeman08@gmail.com
 Nathan Froyd                                   froydnj@codesourcery.com
 Chao-ying Fu                                   fu@mips.com
 Gary Funck                                     gary@intrepid.com
+Pompapathi V Gadad                             Pompapathi.V.Gadad@nsc.com
 Kaveh Ghazi                                    ghazi@gcc.gnu.org
 Matthew Gingell                                        gingell@gnat.com
 Tristan Gingold                                        gingold@adacore.com
index 2dd0d51..1198346 100644 (file)
@@ -2,7 +2,7 @@
 # wanting multilib support.
 #
 # Copyright (C) 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2010  Free Software Foundation, Inc.
+# 2005, 2006, 2007, 2008, 2010, 2011  Free Software Foundation, Inc.
 #
 # This file is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -224,19 +224,6 @@ done
 # $host here, not $target.
 
 case "${host}" in
-arc-*-elf*)
-       if [ x$enable_biendian != xyes ]
-       then
-         old_multidirs=${multidirs}
-         multidirs=""
-         for x in ${old_multidirs}; do
-           case "${x}" in
-             *be*) : ;;
-             *) multidirs="${multidirs} ${x}" ;;
-           esac
-         done
-       fi
-       ;;
 arm-*-*)
        if [ x"$enable_fpu" = xno ]
        then
index 9725f92..520471c 100755 (executable)
--- a/configure
+++ b/configure
@@ -3224,7 +3224,7 @@ case "${target}" in
     libgloss_dir=wince
     ;;
   arc-*-*)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss"
     ;;
   arm-semi-aof )
     ;;
@@ -3298,7 +3298,6 @@ case "${target}" in
     libgloss_dir=cris
     ;;
   crx-*-*)
-    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-mudflap ${libgcj}"
     ;;
   d10v-*-*)
     noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj}"
@@ -3416,7 +3415,7 @@ case "${target}" in
   i[3456789]86-*-uwin* | i[3456789]86-*-interix* )
     ;;
   i[3456789]86-*-pe)
-    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss"
     ;;
   i[3456789]86-*-sco3.2v5*)
     # The linker does not yet know about weak symbols in COFF,
@@ -3442,7 +3441,7 @@ case "${target}" in
     noconfigdirs="$noconfigdirs ${libgcj}"
     ;;
   m68hc11-*-*|m6811-*-*|m68hc12-*-*|m6812-*-*)
-    noconfigdirs="$noconfigdirs target-libiberty target-libstdc++-v3 ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libiberty"
     libgloss_dir=m68hc11
     ;;
   m68k-*-elf*)
@@ -3455,9 +3454,6 @@ case "${target}" in
     libgloss_dir=m68k
     ;;
   mcore-*-pe*)
-  # The EPOC C++ environment does not support exceptions or rtti,
-  # and so building libstdc++-v3 tends not to always work.
-    noconfigdirs="$noconfigdirs target-libstdc++-v3"
     ;;
   mmix-*-*)
     noconfigdirs="$noconfigdirs target-libffi target-boehm-gc gdb libgloss"
index 58bbe44..977db12 100644 (file)
@@ -670,7 +670,7 @@ case "${target}" in
     libgloss_dir=wince
     ;;
   arc-*-*)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss"
     ;;
   arm-semi-aof )
     ;;
@@ -744,7 +744,6 @@ case "${target}" in
     libgloss_dir=cris
     ;;
   crx-*-*)
-    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-mudflap ${libgcj}"
     ;;
   d10v-*-*)
     noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj}"
@@ -862,7 +861,7 @@ case "${target}" in
   i[[3456789]]86-*-uwin* | i[[3456789]]86-*-interix* )
     ;;
   i[[3456789]]86-*-pe)
-    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss"
     ;;
   i[[3456789]]86-*-sco3.2v5*)
     # The linker does not yet know about weak symbols in COFF,
@@ -888,7 +887,7 @@ case "${target}" in
     noconfigdirs="$noconfigdirs ${libgcj}"
     ;;
   m68hc11-*-*|m6811-*-*|m68hc12-*-*|m6812-*-*)
-    noconfigdirs="$noconfigdirs target-libiberty target-libstdc++-v3 ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libiberty"
     libgloss_dir=m68hc11
     ;;
   m68k-*-elf*)
@@ -901,9 +900,6 @@ case "${target}" in
     libgloss_dir=m68k
     ;;
   mcore-*-pe*)
-  # The EPOC C++ environment does not support exceptions or rtti,
-  # and so building libstdc++-v3 tends not to always work.
-    noconfigdirs="$noconfigdirs target-libstdc++-v3"
     ;;
   mmix-*-*)
     noconfigdirs="$noconfigdirs target-libffi target-boehm-gc gdb libgloss"
index 7ac0351..2ece1b7 100644 (file)
@@ -1,3 +1,7 @@
+2011-03-22  Joseph Myers  <joseph@codesourcery.com>
+
+       * compare-all-tests (all_targets): Remove crx and m68hc11.
+
 2011-03-21  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        PR bootstrap/48135
index 91d0e78..cf3d88b 100644 (file)
@@ -1,7 +1,7 @@
 #! /bin/bash
 
 # Compare the assembly language output for all the gcc tests.
-# Copyright (C) 2009 Free Software Foundation, Inc.
+# Copyright (C) 2009, 2011 Free Software Foundation, Inc.
 # Contributed by Paolo Bonzini.
 #
 # Invoke it as "bash compare-all-tests target1 target2 ... targetN".
@@ -36,7 +36,7 @@ sh64_opts='-m5-32media -m5-32media-nofpu -m5-64media -m5-64media-nofpu -m5-compa
 sh_opts='-m3 -m3e -m4 -m4a -m4al -m4/-mieee -m1 -m1/-mno-cbranchdi -m2a -m2a/-mieee -m2e -m2e/-mieee'
 sparc_opts='-mcpu=v8/-m32 -mcpu=v9/-m32 -m64'
 
-all_targets='alpha arm avr bfin cris crx fr30 frv h8300 ia64 iq2000 m32c m32r m68hc11 m68k mcore mips mmix mn10300 pa pdp11 picochip ppc score sh sh64 sparc spu v850 vax xstormy16 xtensa' # e500 
+all_targets='alpha arm avr bfin cris fr30 frv h8300 ia64 iq2000 m32c m32r m68k mcore mips mmix mn10300 pa pdp11 picochip ppc score sh sh64 sparc spu v850 vax xstormy16 xtensa' # e500 
 
 test_one_file ()
 {
index c34189a..57ac148 100644 (file)
@@ -1,3 +1,7 @@
+2011-03-22  Joseph Myers  <joseph@codesourcery.com>
+
+       * mkfixinc.sh: Don't handle i?86-moss-msdos* or i?86-*-pe.
+
 2010-11-20  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
 
        PR other/46202
index b45f179..bd8d37a 100755 (executable)
@@ -12,8 +12,6 @@ target=fixinc.sh
 # Check for special fix rules for particular targets
 case $machine in
     alpha*-dec-*vms* | \
-    i?86-moss-msdos* | \
-    i?86-*-pe | \
     i?86-*-cygwin* | \
     i?86-*-mingw32* | \
     x86_64-*-mingw32* | \
index e41ebc6..efe5aa1 100644 (file)
@@ -1,3 +1,61 @@
+2011-03-22  Joseph Myers  <joseph@codesourcery.com>
+
+       * config/alpha/gnu.h: Remove.
+       * config/arc: Remove directory.
+       * config/arm/netbsd.h: Remove.
+       * config/arm/t-pe: Remove.
+       * config/crx: Remove directory.
+       * config/i386/netbsd.h: Remove.
+       * config/m68hc11: Remove directory.
+       * config/m68k/uclinux-oldabi.h: Remove.
+       * config/mcore/mcore-pe.h: Remove.
+       * config/mcore/t-mcore-pe: Remove.
+       * config/netbsd-aout.h: Remove.
+       * config/rs6000/gnu.h: Remove.
+       * config/sh/sh-symbian.h: Remove.
+       * config/sh/symbian-base.c: Remove.
+       * config/sh/symbian-c.c: Remove.
+       * config/sh/symbian-cxx.c: Remove.
+       * config/sh/symbian-post.h: Remove.
+       * config/sh/symbian-pre.h: Remove.
+       * config/sh/t-symbian: Remove.
+       * config/svr3.h: Remove.
+       * config/vax/netbsd.h: Remove.
+       * config.build: Don't handle i[34567]86-*-pe.
+       * config.gcc: Remove handling of deprecations for most deprecated
+       targets.
+       (m68k-*-uclinuxoldabi*): Add to second deprecated list.
+       (alpha*-*-gnu*, arc-*-elf*, arm*-*-netbsd*, arm-*-pe*, crx-*-elf,
+       i[34567]86-*-netbsd*, i[34567]86-*-pe, m68hc11-*-*|m6811-*-*,
+       m68hc12-*-*|m6812-*-*, m68k-*-uclinuxoldabi*, mcore-*-pe*,
+       powerpc64-*-gnu*, powerpc-*-gnu-gnualtivec*, powerpc-*-gnu*,
+       sh-*-symbianelf* | sh[12346l]*-*-symbianelf*, vax-*-netbsd*):
+       Remove cases.
+       * config.host: Don't handle i[34567]86-*-pe.
+       * config/rs6000/linux64.h (LINK_OS_GNU_SPEC): Remove.
+       (ASM_SPEC32): Don't handle -mcall-gnu.
+       * config/rs6000/sysv4.h (SUBTARGET_OVERRIDE_OPTIONS): Don't handle
+       -mcall-gnu.
+       (ASM_SPEC, CC1_SPEC, LINK_START_SPEC, LINK_OS_SPEC, CPP_SPEC,
+       STARTFILE_SPEC, LIB_SPEC, ENDFILE_SPEC): Don't handle -mcall-gnu.
+       (LIB_GNU_SPEC, STARTFILE_GNU_SPEC, ENDFILE_GNU_SPEC,
+       LINK_START_GNU_SPEC, LINK_OS_GNU_SPEC, CPP_OS_GNU_SPEC): Remove.
+       (SUBTARGET_EXTRA_SPECS): Remove *_gnu specs.
+       * config/sh/sh-protos.h, config/sh/sh.c: Remove all code
+       conditional on SYMBIAN.
+       * configure.ac: Don't handle powerpc*-*-gnu*.
+       * configure: Regenerate.
+       * doc/extend.texi (interrupt attribute): Don't mention CRX.
+       * doc/install-old.texi (m6811, m6812): Don't mention.
+       * doc/install.texi (arc-*-elf*): Don't document multilib option.
+       (arc-*-elf, CRX, m6811-elf, m6812-elf): Remove.
+       (m68k-uclinuxoldabi): Don't mention.
+       * doc/invoke.texi (ARC Options, CRX Options, M68hc1x Options):
+       Remove.
+       (-mcall-gnu): Remove.
+       * doc/md.texi (CRX Architecture, Motorola 68HC11 & 68HC12
+       families): Remove constraint documentation.
+
 2011-03-22  Marius Strobl  <marius@FreeBSD.org>
 
        * config/sparc/freebsd.h (CPP_CPU64_DEFAULT_SPEC): Replace with...
index 6c837c3..abb27d7 100644 (file)
@@ -1,5 +1,6 @@
 # GCC build-specific configuration file.
-# Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2007, 2008, 2009, 2010
+# Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2007, 2008, 2009, 2010,
+# 2011
 # Free Software Foundation, Inc.
 
 #This file is part of GCC.
@@ -75,7 +76,7 @@ case $build in
     # IBM 360/370/390 Architecture
     build_xm_defines='FATAL_EXIT_CODE=12'
     ;;
-  i[34567]86-*-cygwin* | i[34567]86-*-pe )
+  i[34567]86-*-cygwin* )
     build_xm_file=i386/xm-cygwin.h
     build_exeext=.exe
     ;;
index d288e6a..bec9279 100644 (file)
@@ -226,32 +226,9 @@ md_file=
 
 # Obsolete configurations.
 case ${target} in
-# Avoid cases below matching.
-   alpha*-*-linux*                     \
- | arm*-wince-pe*                      \
- | arm*-*-netbsdelf*                   \
- | i[34567]86-*-netbsdelf*             \
- | powerpc*-*-linux*                   \
- | vax-*-netbsdelf*) ;;
-   arc-*                               \
- | alpha*-*-gnu*                       \
- | arm*-*-netbsd*                      \
- | arm-*-pe*                           \
- | crx-*                               \
- | i[34567]86-*-interix3*              \
- | i[34567]86-*-netbsd*                        \
- | i[34567]86-*-pe                     \
- | m68hc11-*-*                         \
- | m6811-*-*                           \
- | m68hc12-*-*                         \
- | m6812-*-*                           \
- | m68k-*-uclinuxoldabi*               \
- | mcore-*-pe*                         \
- | powerpc*-*-gnu*                     \
+   i[34567]86-*-interix3*              \
  | score-*                             \
- | sh*-*-symbianelf*                   \
  | *-*-solaris2.8*                     \
- | vax-*-netbsd*                       \
  )
     if test "x$enable_obsolete" != xyes; then
       echo "*** Configuration ${target} is obsolete." >&2
@@ -268,6 +245,7 @@ esac
 case ${target} in
    i[34567]86-go32-*                   \
  | i[34567]86-*-go32*                  \
+ | m68k-*-uclinuxoldabi*               \
  | mips64orion*-*-rtems*               \
  | pdp11-*-bsd                         \
  | sparc-hal-solaris2*                 \
@@ -720,12 +698,6 @@ alpha*-*-linux*)
        target_cpu_default="MASK_GAS"
        tmake_file="${tmake_file} alpha/t-crtfm alpha/t-alpha alpha/t-ieee alpha/t-linux"
        ;;
-alpha*-*-gnu*)
-       tm_file="$tm_file alpha/elf.h alpha/linux.h alpha/linux-elf.h gnu.h glibc-stdint.h alpha/gnu.h"
-       extra_options="${extra_options} alpha/elf.opt"
-       target_cpu_default="MASK_GAS"
-       tmake_file="${tmake_file} alpha/t-crtfm alpha/t-alpha alpha/t-ieee"
-       ;;
 alpha*-*-freebsd*)
        tm_file="${tm_file} ${fbsd_tm_file} alpha/elf.h alpha/freebsd.h"
        extra_options="${extra_options} alpha/elf.opt"
@@ -789,10 +761,6 @@ alpha*-dec-*vms*)
        install_headers_dir=install-headers-cp
        extra_options="${extra_options} vms/vms.opt"
        ;;
-arc-*-elf*)
-       tm_file="dbxelf.h elfos.h newlib-stdint.h ${tm_file}"
-       extra_parts="crtinit.o crtfini.o"
-       ;;
 arm-wrs-vxworks)
        tm_file="elfos.h arm/elf.h arm/aout.h ${tm_file} vx-common.h vxworks.h arm/vxworks.h"
        extra_options="${extra_options} arm/vxworks.opt"
@@ -807,13 +775,6 @@ arm*-*-netbsdelf*)
        extra_options="${extra_options} netbsd.opt netbsd-elf.opt"
        tmake_file="${tmake_file} arm/t-arm arm/t-netbsd"
        ;;
-arm*-*-netbsd*)
-       tm_file="arm/aout.h arm/arm.h netbsd.h netbsd-aout.h arm/netbsd.h"
-       extra_options="${extra_options} netbsd.opt"
-       tmake_file="t-netbsd arm/t-arm arm/t-netbsd"
-       extra_parts=""
-       use_collect2=yes
-       ;;
 arm*-*-linux*)                 # ARM GNU/Linux with ELF
        tm_file="dbxelf.h elfos.h gnu-user.h linux.h linux-android.h glibc-stdint.h arm/elf.h arm/linux-gas.h arm/linux-elf.h"
        case $target in
@@ -911,13 +872,6 @@ arm*-wince-pe*)
        extra_options="${extra_options} arm/pe.opt"
        extra_objs="pe.o"
        ;;
-arm-*-pe*)
-       tm_file="arm/semi.h arm/aout.h arm/arm.h arm/coff.h dbxcoff.h arm/pe.h newlib-stdint.h"
-       tmake_file="arm/t-arm arm/t-pe"
-       use_gcc_stdint=wrap
-       extra_options="${extra_options} arm/pe.opt"
-       extra_objs="pe.o"
-       ;;
 avr-*-rtems*)
        tm_file="avr/avr.h dbxelf.h avr/rtems.h rtems.h newlib-stdint.h"
        tmake_file="avr/t-avr t-rtems avr/t-rtems"
@@ -985,11 +939,6 @@ crisv32-*-linux* | cris-*-linux*)
                ;;
        esac
        ;;
-crx-*-elf)
-       tm_file="elfos.h newlib-stdint.h ${tm_file}"
-       extra_parts="crtbegin.o crtend.o"
-       use_collect2=no
-       ;;
 fr30-*-elf)
        tm_file="dbxelf.h elfos.h newlib-stdint.h ${tm_file}"
        tmake_file=fr30/t-fr30
@@ -1222,13 +1171,6 @@ i[34567]86-*-netbsdelf*)
        tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h netbsd.h netbsd-elf.h i386/netbsd-elf.h"
        extra_options="${extra_options} netbsd.opt netbsd-elf.opt"
        ;;
-i[34567]86-*-netbsd*)
-       tm_file="${tm_file} i386/unix.h i386/bsd.h i386/gas.h i386/gstabs.h netbsd.h netbsd-aout.h i386/netbsd.h"
-       extra_options="${extra_options} netbsd.opt"
-       tmake_file="${tmake_file} t-netbsd"
-       extra_parts=""
-       use_collect2=yes
-       ;;
 x86_64-*-netbsd*)
        tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h netbsd.h netbsd-elf.h i386/x86-64.h i386/netbsd64.h"
        extra_options="${extra_options} netbsd.opt netbsd-elf.opt"
@@ -1441,7 +1383,7 @@ i[4567]86-wrs-vxworks|i[4567]86-wrs-vxworksae)
            ;;
        esac
        ;;
-i[34567]86-*-pe | i[34567]86-*-cygwin*)
+i[34567]86-*-cygwin*)
        tm_file="${tm_file} i386/unix.h i386/bsd.h i386/gas.h dbxcoff.h i386/cygming.h i386/cygwin.h i386/cygwin-stdint.h"
        xm_file=i386/xm-cygwin.h
        # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h
@@ -1686,24 +1628,6 @@ m32rle-*-linux*)
                thread_file='posix'
        fi
        ;;
-# m68hc11 and m68hc12 share the same machine description.
-m68hc11-*-*|m6811-*-*)
-       tm_file="dbxelf.h elfos.h usegas.h newlib-stdint.h m68hc11/m68hc11.h"
-       tm_p_file="m68hc11/m68hc11-protos.h"
-       md_file="m68hc11/m68hc11.md"
-       out_file="m68hc11/m68hc11.c"
-       tmake_file="m68hc11/t-m68hc11"
-       use_gcc_stdint=wrap
-        ;;
-m68hc12-*-*|m6812-*-*)
-       tm_file="m68hc11/m68hc12.h dbxelf.h elfos.h usegas.h newlib-stdint.h m68hc11/m68hc11.h"
-       tm_p_file="m68hc11/m68hc11-protos.h"
-       md_file="m68hc11/m68hc11.md"
-       out_file="m68hc11/m68hc11.c"
-       tmake_file="m68hc11/t-m68hc11"
-       extra_options="${extra_options} m68hc11/m68hc11.opt"
-       use_gcc_stdint=wrap
-        ;;
 m68k-*-elf* | fido-*-elf*)
        case ${target} in
        fido-*-elf*)
@@ -1754,15 +1678,6 @@ m68k*-*-openbsd*)
        # we need collect2 until our bug is fixed...
        use_collect2=yes
        ;;
-m68k-*-uclinuxoldabi*)         # Motorola m68k/ColdFire running uClinux
-                               # with uClibc, using the original
-                               # m68k-elf-based ABI
-       default_m68k_cpu=68020
-       default_cf_cpu=5206
-       tm_file="${tm_file} m68k/m68k-none.h m68k/m68kelf.h dbxelf.h elfos.h m68k/uclinux-oldabi.h glibc-stdint.h"
-       tm_defines="${tm_defines} MOTOROLA=1"
-       tmake_file="m68k/t-floatlib m68k/t-uclinux"
-       ;;
 m68k-*-uclinux*)               # Motorola m68k/ColdFire running uClinux
                                # with uClibc, using the new GNU/Linux-style
                                # ABI.
@@ -1802,12 +1717,6 @@ mcore-*-elf)
        tmake_file=mcore/t-mcore
        inhibit_libc=true
        ;;
-mcore-*-pe*)
-       tm_file="svr3.h dbxcoff.h newlib-stdint.h ${tm_file} mcore/mcore-pe.h"
-       tmake_file=mcore/t-mcore-pe
-       inhibit_libc=true
-       use_gcc_stdint=wrap
-       ;;
 mep-*-*)
        tm_file="dbxelf.h elfos.h ${tm_file}"
        tmake_file=mep/t-mep
@@ -2171,27 +2080,6 @@ powerpc-*-linux* | powerpc64-*-linux*)
                tm_file="rs6000/secureplt.h ${tm_file}"
        fi
        ;;
-powerpc64-*-gnu*)
-       tm_file="${tm_file} elfos.h freebsd-spec.h gnu.h rs6000/sysv4.h rs6000/default64.h rs6000/linux64.h rs6000/gnu.h glibc-stdint.h"
-       extra_options="${extra_options} rs6000/sysv4.opt rs6000/linux64.opt"
-       tmake_file="t-slibgcc-elf-ver t-slibgcc-libgcc t-gnu"
-       ;;
-powerpc-*-gnu-gnualtivec*)
-       tm_file="${cpu_type}/${cpu_type}.h elfos.h freebsd-spec.h gnu.h rs6000/sysv4.h rs6000/linux.h rs6000/linuxaltivec.h rs6000/gnu.h glibc-stdint.h"
-       extra_options="${extra_options} rs6000/sysv4.opt"
-       tmake_file="rs6000/t-fprules rs6000/t-fprules-fpbit rs6000/t-ppcos t-slibgcc-elf-ver t-slibgcc-libgcc t-gnu rs6000/t-ppccomm"
-       if test x$enable_threads = xyes; then
-               thread_file='posix'
-       fi
-       ;;
-powerpc-*-gnu*)
-       tm_file="${cpu_type}/${cpu_type}.h elfos.h freebsd-spec.h gnu.h rs6000/sysv4.h rs6000/linux.h rs6000/gnu.h glibc-stdint.h"
-       tmake_file="rs6000/t-fprules rs6000/t-fprules-fpbit rs6000/t-ppcos t-slibgcc-elf-ver t-slibgcc-libgcc t-gnu rs6000/t-ppccomm"
-       extra_options="${extra_options} rs6000/sysv4.opt"
-       if test x$enable_threads = xyes; then
-               thread_file='posix'
-       fi
-       ;;
 powerpc-wrs-vxworks|powerpc-wrs-vxworksae)
        tm_file="${tm_file} elfos.h freebsd-spec.h rs6000/sysv4.h"
        tmake_file="${tmake_file} rs6000/t-fprules rs6000/t-fprules-fpbit rs6000/t-ppccomm rs6000/t-vxworks"
@@ -2313,7 +2201,6 @@ score-*-elf)
         extra_objs="score7.o"
         ;;
 sh-*-elf* | sh[12346l]*-*-elf* | \
-sh-*-symbianelf* | sh[12346l]*-*-symbianelf* | \
   sh-*-linux* | sh[2346lbe]*-*-linux* | \
   sh-*-netbsdelf* | shl*-*-netbsdelf* | sh5-*-netbsd* | sh5l*-*-netbsd* | \
    sh64-*-netbsd* | sh64l*-*-netbsd*)
@@ -2390,13 +2277,6 @@ sh-*-symbianelf* | sh[12346l]*-*-symbianelf* | \
                fi
                extra_headers="shmedia.h ushmedia.h sshmedia.h"
                ;;
-       *-*-symbianelf*)
-               tmake_file="sh/t-symbian"
-               tm_file="sh/symbian-pre.h sh/little.h ${tm_file} sh/symbian-post.h"
-               c_target_objs="symbian-base.o symbian-c.o"
-               cxx_target_objs="symbian-base.o symbian-cxx.o"
-               extra_parts="crt1.o crti.o crtn.o crtbegin.o crtend.o crtbeginS.o crtendS.o"
-               ;;
        *-*-elf*)
                tm_file="${tm_file} newlib-stdint.h"
                ;;
@@ -2714,13 +2594,6 @@ vax-*-netbsdelf*)
        tm_file="${tm_file} elfos.h netbsd.h netbsd-elf.h vax/elf.h vax/netbsd-elf.h"
        extra_options="${extra_options} netbsd.opt netbsd-elf.opt vax/elf.opt"
        ;;
-vax-*-netbsd*)
-       tm_file="${tm_file} netbsd.h netbsd-aout.h vax/netbsd.h"
-       extra_options="${extra_options} netbsd.opt"
-       tmake_file=t-netbsd
-       extra_parts=""
-       use_collect2=yes
-       ;;
 vax-*-openbsd*)
        tm_file="vax/vax.h vax/openbsd1.h openbsd.h openbsd-stdint.h openbsd-pthread.h vax/openbsd.h"
        extra_options="${extra_options} openbsd.opt"
index d0342b9..a2bde44 100644 (file)
@@ -211,7 +211,7 @@ case ${host} in
         ;;
     esac
     ;;
-  i[34567]86-*-pe | i[34567]86-*-cygwin*)
+  i[34567]86-*-cygwin*)
     host_xm_file=i386/xm-cygwin.h
     out_host_hook_obj=host-cygwin.o
     host_xmake_file="${host_xmake_file} i386/x-cygwin"
diff --git a/gcc/config/alpha/gnu.h b/gcc/config/alpha/gnu.h
deleted file mode 100644 (file)
index ca71980..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Configuration for an Alpha running GNU with ELF as the target machine.
-
-Copyright (C) 2002, 2003, 2004, 2010 Free Software Foundation, 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 3, 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.
-
-Under Section 7 of GPL version 3, you are granted additional
-permissions described in the GCC Runtime Library Exception, version
-3.1, as published by the Free Software Foundation.
-
-You should have received a copy of the GNU General Public License and
-a copy of the GCC Runtime Library Exception along with this program;
-see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-<http://www.gnu.org/licenses/>.  */
-
-#undef TARGET_VERSION
-#define TARGET_VERSION fprintf (stderr, " (Alpha GNU)");
-
-#undef TARGET_OS_CPP_BUILTINS /* config.gcc includes alpha/linux.h.  */
-#define TARGET_OS_CPP_BUILTINS()               \
-    do {                                       \
-       LINUX_TARGET_OS_CPP_BUILTINS();         \
-       builtin_define ("_LONGLONG");           \
-    } while (0)
-
-#undef ELF_DYNAMIC_LINKER
-#define ELF_DYNAMIC_LINKER     "/lib/ld.so"
-
-#undef STARTFILE_SPEC
-#define STARTFILE_SPEC \
-  "%{!shared: \
-     %{!static: \
-       %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} \
-     %{static:crt0.o%s}} \
-   crti.o%s \
-   %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}"
-
-/* FIXME: Is a Hurd-specific fallback mechanism necessary?  */
-#undef MD_UNWIND_SUPPORT
diff --git a/gcc/config/arc/arc-modes.def b/gcc/config/arc/arc-modes.def
deleted file mode 100644 (file)
index c2d2cea..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Definitions of target machine for GNU compiler, Argonaut ARC cpu.
-   Copyright (C) 2002, 2007 Free Software Foundation, 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 3, 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 COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* Some insns set all condition code flags, some only set the ZNC flags, and
-   some only set the ZN flags.  */
-
-CC_MODE (CCZNC);
-CC_MODE (CCZN);
diff --git a/gcc/config/arc/arc-protos.h b/gcc/config/arc/arc-protos.h
deleted file mode 100644 (file)
index 5550ebf..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/* Definitions of target machine for GNU compiler, Argonaut ARC cpu.
-   Copyright (C) 2000, 2004, 2007, 2010 Free Software Foundation, 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 3, 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 COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifdef RTX_CODE
-extern enum machine_mode arc_select_cc_mode (enum rtx_code, rtx, rtx);
-
-/* Define the function that build the compare insn for scc and bcc.  */
-extern struct rtx_def *gen_compare_reg (enum rtx_code, rtx, rtx);
-#endif
-
-/* Declarations for various fns used in the .md file.  */
-extern const char *output_shift (rtx *);
-
-extern int symbolic_operand (rtx, enum machine_mode);
-extern int arc_double_limm_p (rtx);
-extern int arc_eligible_for_epilogue_delay (rtx, int);
-extern void arc_initialize_trampoline (rtx, rtx, rtx);
-extern void arc_print_operand (FILE *, rtx, int);
-extern void arc_print_operand_address (FILE *, rtx);
-extern void arc_final_prescan_insn (rtx, rtx *, int);
-extern int call_address_operand (rtx, enum machine_mode);
-extern int call_operand (rtx, enum machine_mode);
-extern int symbolic_memory_operand (rtx, enum machine_mode);
-extern int short_immediate_operand (rtx, enum machine_mode);
-extern int long_immediate_operand (rtx, enum machine_mode);
-extern int long_immediate_loadstore_operand (rtx, enum machine_mode);
-extern int move_src_operand (rtx, enum machine_mode);
-extern int move_double_src_operand (rtx, enum machine_mode);
-extern int move_dest_operand (rtx, enum machine_mode);
-extern int load_update_operand (rtx, enum machine_mode);
-extern int store_update_operand (rtx, enum machine_mode);
-extern int nonvol_nonimm_operand (rtx, enum machine_mode);
-extern int const_sint32_operand (rtx, enum machine_mode);
-extern int const_uint32_operand (rtx, enum machine_mode);
-extern int proper_comparison_operator (rtx, enum machine_mode);
-extern int shift_operator (rtx, enum machine_mode);
-
-extern enum arc_function_type arc_compute_function_type (tree);
-
-
-extern unsigned int arc_compute_frame_size (int);
-extern void arc_save_restore (FILE *, const char *, unsigned int,
-                             unsigned int, const char *);
-extern int arc_delay_slots_for_epilogue (void);
-extern void arc_ccfsm_at_label (const char *, int);
-extern int arc_ccfsm_branch_deleted_p (void);
-extern void arc_ccfsm_record_branch_deleted (void);
diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
deleted file mode 100644 (file)
index fa92ccf..0000000
+++ /dev/null
@@ -1,2493 +0,0 @@
-/* Subroutines used for code generation on the Argonaut ARC cpu.
-   Copyright (C) 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
-   2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, 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 3, 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 COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* ??? This is an old port, and is undoubtedly suffering from bit rot.  */
-
-#include "config.h"
-#include "system.h"
-#include "coretypes.h"
-#include "tm.h"
-#include "tree.h"
-#include "rtl.h"
-#include "regs.h"
-#include "hard-reg-set.h"
-#include "insn-config.h"
-#include "conditions.h"
-#include "output.h"
-#include "insn-attr.h"
-#include "flags.h"
-#include "function.h"
-#include "expr.h"
-#include "recog.h"
-#include "diagnostic-core.h"
-#include "df.h"
-#include "tm_p.h"
-#include "target.h"
-#include "target-def.h"
-
-/* Which cpu we're compiling for.  */
-int arc_cpu_type;
-
-/* Name of mangle string to add to symbols to separate code compiled for each
-   cpu (or NULL).  */
-const char *arc_mangle_cpu;
-
-/* Name of text, data, and rodata sections used in varasm.c.  */
-const char *arc_text_section;
-const char *arc_data_section;
-const char *arc_rodata_section;
-
-/* Array of valid operand punctuation characters.  */
-char arc_punct_chars[256];
-
-/* Variables used by arc_final_prescan_insn to implement conditional
-   execution.  */
-static int arc_ccfsm_state;
-static int arc_ccfsm_current_cc;
-static rtx arc_ccfsm_target_insn;
-static int arc_ccfsm_target_label;
-
-/* The maximum number of insns skipped which will be conditionalised if
-   possible.  */
-#define MAX_INSNS_SKIPPED 3
-
-/* A nop is needed between a 4 byte insn that sets the condition codes and
-   a branch that uses them (the same isn't true for an 8 byte insn that sets
-   the condition codes).  Set by arc_final_prescan_insn.  Used by
-   arc_print_operand.  */
-static int last_insn_set_cc_p;
-static int current_insn_set_cc_p;
-static bool arc_handle_option (size_t, const char *, int);
-static void record_cc_ref (rtx);
-static void arc_init_reg_tables (void);
-static int get_arc_condition_code (rtx);
-static tree arc_handle_interrupt_attribute (tree *, tree, tree, int, bool *);
-static bool arc_assemble_integer (rtx, unsigned int, int);
-static void arc_output_function_prologue (FILE *, HOST_WIDE_INT);
-static void arc_output_function_epilogue (FILE *, HOST_WIDE_INT);
-static void arc_file_start (void);
-static void arc_internal_label (FILE *, const char *, unsigned long);
-static void arc_va_start (tree, rtx);
-static void arc_setup_incoming_varargs (CUMULATIVE_ARGS *, enum machine_mode,
-                                       tree, int *, int);
-static bool arc_rtx_costs (rtx, int, int, int *, bool);
-static int arc_address_cost (rtx, bool);
-static void arc_external_libcall (rtx);
-static bool arc_return_in_memory (const_tree, const_tree);
-static bool arc_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode,
-                                  const_tree, bool);
-static rtx arc_function_arg (CUMULATIVE_ARGS *, enum machine_mode,
-                            const_tree, bool);
-static void arc_function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode,
-                                     const_tree, bool);
-static unsigned int arc_function_arg_boundary (enum machine_mode, const_tree);
-static void arc_trampoline_init (rtx, tree, rtx);
-static void arc_option_override (void);
-static void arc_conditional_register_usage (void);
-
-\f
-/* ARC specific attributs.  */
-
-static const struct attribute_spec arc_attribute_table[] =
-{
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity } */
-  { "interrupt", 1, 1, true,  false, false, arc_handle_interrupt_attribute,
-    false },
-  { NULL,        0, 0, false, false, false, NULL, false }
-};
-\f
-/* Initialize the GCC target structure.  */
-#undef TARGET_ASM_ALIGNED_HI_OP
-#define TARGET_ASM_ALIGNED_HI_OP "\t.hword\t"
-#undef TARGET_ASM_ALIGNED_SI_OP
-#define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
-#undef TARGET_ASM_INTEGER
-#define TARGET_ASM_INTEGER arc_assemble_integer
-
-#undef TARGET_ASM_FUNCTION_PROLOGUE
-#define TARGET_ASM_FUNCTION_PROLOGUE arc_output_function_prologue
-#undef TARGET_ASM_FUNCTION_EPILOGUE
-#define TARGET_ASM_FUNCTION_EPILOGUE arc_output_function_epilogue
-#undef TARGET_ASM_FILE_START
-#define TARGET_ASM_FILE_START arc_file_start
-#undef TARGET_ATTRIBUTE_TABLE
-#define TARGET_ATTRIBUTE_TABLE arc_attribute_table
-#undef TARGET_ASM_INTERNAL_LABEL
-#define TARGET_ASM_INTERNAL_LABEL arc_internal_label
-#undef TARGET_ASM_EXTERNAL_LIBCALL
-#define TARGET_ASM_EXTERNAL_LIBCALL arc_external_libcall
-
-#undef TARGET_HANDLE_OPTION
-#define TARGET_HANDLE_OPTION arc_handle_option
-
-#undef TARGET_OPTION_OVERRIDE
-#define TARGET_OPTION_OVERRIDE arc_option_override
-
-#undef TARGET_RTX_COSTS
-#define TARGET_RTX_COSTS arc_rtx_costs
-#undef TARGET_ADDRESS_COST
-#define TARGET_ADDRESS_COST arc_address_cost
-
-#undef TARGET_PROMOTE_FUNCTION_MODE
-#define TARGET_PROMOTE_FUNCTION_MODE default_promote_function_mode_always_promote
-#undef TARGET_PROMOTE_PROTOTYPES
-#define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
-
-#undef TARGET_RETURN_IN_MEMORY
-#define TARGET_RETURN_IN_MEMORY arc_return_in_memory
-#undef TARGET_PASS_BY_REFERENCE
-#define TARGET_PASS_BY_REFERENCE arc_pass_by_reference
-#undef TARGET_FUNCTION_ARG
-#define TARGET_FUNCTION_ARG arc_function_arg
-#undef TARGET_FUNCTION_ARG_ADVANCE
-#define TARGET_FUNCTION_ARG_ADVANCE arc_function_arg_advance
-#undef TARGET_FUNCTION_ARG_BOUNDARY
-#define TARGET_FUNCTION_ARG_BOUNDARY arc_function_arg_boundary
-#undef TARGET_CALLEE_COPIES
-#define TARGET_CALLEE_COPIES hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true
-
-#undef TARGET_SETUP_INCOMING_VARARGS
-#define TARGET_SETUP_INCOMING_VARARGS arc_setup_incoming_varargs
-
-#undef TARGET_EXPAND_BUILTIN_VA_START
-#define TARGET_EXPAND_BUILTIN_VA_START arc_va_start
-
-#undef TARGET_TRAMPOLINE_INIT
-#define TARGET_TRAMPOLINE_INIT arc_trampoline_init
-
-#undef TARGET_CONDITIONAL_REGISTER_USAGE
-#define TARGET_CONDITIONAL_REGISTER_USAGE arc_conditional_register_usage
-
-struct gcc_target targetm = TARGET_INITIALIZER;
-\f
-/* Implement TARGET_HANDLE_OPTION.  */
-
-static bool
-arc_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED)
-{
-  switch (code)
-    {
-    case OPT_mcpu_:
-      return strcmp (arg, "base") == 0 || ARC_EXTENSION_CPU (arg);
-
-    default:
-      return true;
-    }
-}
-
-/* Implement TARGET_OPTION_OVERRIDE.
-   These need to be done at start up.  It's convenient to do them here.  */
-
-static void
-arc_option_override (void)
-{
-  char *tmp;
-  
-  /* Set the pseudo-ops for the various standard sections.  */
-  arc_text_section = tmp = XNEWVEC (char, strlen (arc_text_string) + sizeof (ARC_SECTION_FORMAT) + 1);
-  sprintf (tmp, ARC_SECTION_FORMAT, arc_text_string);
-  arc_data_section = tmp = XNEWVEC (char, strlen (arc_data_string) + sizeof (ARC_SECTION_FORMAT) + 1);
-  sprintf (tmp, ARC_SECTION_FORMAT, arc_data_string);
-  arc_rodata_section = tmp = XNEWVEC (char, strlen (arc_rodata_string) + sizeof (ARC_SECTION_FORMAT) + 1);
-  sprintf (tmp, ARC_SECTION_FORMAT, arc_rodata_string);
-
-  arc_init_reg_tables ();
-
-  /* Initialize array for PRINT_OPERAND_PUNCT_VALID_P.  */
-  memset (arc_punct_chars, 0, sizeof (arc_punct_chars));
-  arc_punct_chars['#'] = 1;
-  arc_punct_chars['*'] = 1;
-  arc_punct_chars['?'] = 1;
-  arc_punct_chars['!'] = 1;
-  arc_punct_chars['~'] = 1;
-}
-\f
-/* The condition codes of the ARC, and the inverse function.  */
-static const char *const arc_condition_codes[] =
-{
-  "al", 0, "eq", "ne", "p", "n", "c", "nc", "v", "nv",
-  "gt", "le", "ge", "lt", "hi", "ls", "pnz", 0
-};
-
-#define ARC_INVERSE_CONDITION_CODE(X)  ((X) ^ 1)
-
-/* Returns the index of the ARC condition code string in
-   `arc_condition_codes'.  COMPARISON should be an rtx like
-   `(eq (...) (...))'.  */
-
-static int
-get_arc_condition_code (rtx comparison)
-{
-  switch (GET_CODE (comparison))
-    {
-    case EQ : return 2;
-    case NE : return 3;
-    case GT : return 10;
-    case LE : return 11;
-    case GE : return 12;
-    case LT : return 13;
-    case GTU : return 14;
-    case LEU : return 15;
-    case LTU : return 6;
-    case GEU : return 7;
-    default : gcc_unreachable ();
-    }
-  /*NOTREACHED*/
-  return (42);
-}
-
-/* Given a comparison code (EQ, NE, etc.) and the first operand of a COMPARE,
-   return the mode to be used for the comparison.  */
-
-enum machine_mode
-arc_select_cc_mode (enum rtx_code op,
-                   rtx x ATTRIBUTE_UNUSED,
-                    rtx y ATTRIBUTE_UNUSED)
-{
-  switch (op)
-    {
-    case EQ :
-    case NE :
-      return CCZNmode;
-    default :
-      switch (GET_CODE (x))
-       {
-       case AND :
-       case IOR :
-       case XOR :
-       case SIGN_EXTEND :
-       case ZERO_EXTEND :
-         return CCZNmode;
-       case ASHIFT :
-       case ASHIFTRT :
-       case LSHIFTRT :
-         return CCZNCmode;
-       default:
-         break;
-       }
-    }
-  return CCmode;
-}
-\f
-/* Vectors to keep interesting information about registers where it can easily
-   be got.  We use to use the actual mode value as the bit number, but there
-   is (or may be) more than 32 modes now.  Instead we use two tables: one
-   indexed by hard register number, and one indexed by mode.  */
-
-/* The purpose of arc_mode_class is to shrink the range of modes so that
-   they all fit (as bit numbers) in a 32-bit word (again).  Each real mode is
-   mapped into one arc_mode_class mode.  */
-
-enum arc_mode_class {
-  C_MODE,
-  S_MODE, D_MODE, T_MODE, O_MODE,
-  SF_MODE, DF_MODE, TF_MODE, OF_MODE
-};
-
-/* Modes for condition codes.  */
-#define C_MODES (1 << (int) C_MODE)
-
-/* Modes for single-word and smaller quantities.  */
-#define S_MODES ((1 << (int) S_MODE) | (1 << (int) SF_MODE))
-
-/* Modes for double-word and smaller quantities.  */
-#define D_MODES (S_MODES | (1 << (int) D_MODE) | (1 << DF_MODE))
-
-/* Modes for quad-word and smaller quantities.  */
-#define T_MODES (D_MODES | (1 << (int) T_MODE) | (1 << (int) TF_MODE))
-
-/* Value is 1 if register/mode pair is acceptable on arc.  */
-
-const unsigned int arc_hard_regno_mode_ok[] = {
-  T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES,
-  T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES,
-  T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, D_MODES,
-  D_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES,
-
-  /* ??? Leave these as S_MODES for now.  */
-  S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES,
-  S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES,
-  S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES,
-  S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, C_MODES
-};
-
-unsigned int arc_mode_class [NUM_MACHINE_MODES];
-
-enum reg_class arc_regno_reg_class[FIRST_PSEUDO_REGISTER];
-
-static void
-arc_init_reg_tables (void)
-{
-  int i;
-
-  for (i = 0; i < NUM_MACHINE_MODES; i++)
-    {
-      switch (GET_MODE_CLASS (i))
-       {
-       case MODE_INT:
-       case MODE_PARTIAL_INT:
-       case MODE_COMPLEX_INT:
-         if (GET_MODE_SIZE (i) <= 4)
-           arc_mode_class[i] = 1 << (int) S_MODE;
-         else if (GET_MODE_SIZE (i) == 8)
-           arc_mode_class[i] = 1 << (int) D_MODE;
-         else if (GET_MODE_SIZE (i) == 16)
-           arc_mode_class[i] = 1 << (int) T_MODE;
-         else if (GET_MODE_SIZE (i) == 32)
-           arc_mode_class[i] = 1 << (int) O_MODE;
-         else 
-           arc_mode_class[i] = 0;
-         break;
-       case MODE_FLOAT:
-       case MODE_COMPLEX_FLOAT:
-         if (GET_MODE_SIZE (i) <= 4)
-           arc_mode_class[i] = 1 << (int) SF_MODE;
-         else if (GET_MODE_SIZE (i) == 8)
-           arc_mode_class[i] = 1 << (int) DF_MODE;
-         else if (GET_MODE_SIZE (i) == 16)
-           arc_mode_class[i] = 1 << (int) TF_MODE;
-         else if (GET_MODE_SIZE (i) == 32)
-           arc_mode_class[i] = 1 << (int) OF_MODE;
-         else 
-           arc_mode_class[i] = 0;
-         break;
-       case MODE_CC:
-         arc_mode_class[i] = 1 << (int) C_MODE;
-         break;
-       default:
-         arc_mode_class[i] = 0;
-         break;
-       }
-    }
-
-  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-    {
-      if (i < 60)
-       arc_regno_reg_class[i] = GENERAL_REGS;
-      else if (i == 60)
-       arc_regno_reg_class[i] = LPCOUNT_REG;
-      else if (i == 61)
-       arc_regno_reg_class[i] = NO_REGS /* CC_REG: must be NO_REGS */;
-      else
-       arc_regno_reg_class[i] = NO_REGS;
-    }
-}
-\f
-/* ARC specific attribute support.
-
-   The ARC has these attributes:
-   interrupt - for interrupt functions
-*/
-
-/* Handle an "interrupt" attribute; arguments as in
-   struct attribute_spec.handler.  */
-static tree
-arc_handle_interrupt_attribute (tree *node ATTRIBUTE_UNUSED,
-                                tree name,
-                                tree args,
-                                int flags ATTRIBUTE_UNUSED,
-                                bool *no_add_attrs)
-{
-  tree value = TREE_VALUE (args);
-
-  if (TREE_CODE (value) != STRING_CST)
-    {
-      warning (OPT_Wattributes,
-              "argument of %qE attribute is not a string constant",
-              name);
-      *no_add_attrs = true;
-    }
-  else if (strcmp (TREE_STRING_POINTER (value), "ilink1")
-          && strcmp (TREE_STRING_POINTER (value), "ilink2"))
-    {
-      warning (OPT_Wattributes,
-              "argument of %qE attribute is not \"ilink1\" or \"ilink2\"",
-              name);
-      *no_add_attrs = true;
-    }
-
-  return NULL_TREE;
-}
-
-\f
-/* Acceptable arguments to the call insn.  */
-
-int
-call_address_operand (rtx op, enum machine_mode mode)
-{
-  return (symbolic_operand (op, mode)
-         || (GET_CODE (op) == CONST_INT && LEGITIMATE_CONSTANT_P (op))
-         || (GET_CODE (op) == REG));
-}
-
-int
-call_operand (rtx op, enum machine_mode mode)
-{
-  if (GET_CODE (op) != MEM)
-    return 0;
-  op = XEXP (op, 0);
-  return call_address_operand (op, mode);
-}
-
-/* Returns 1 if OP is a symbol reference.  */
-
-int
-symbolic_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
-{
-  switch (GET_CODE (op))
-    {
-    case SYMBOL_REF:
-    case LABEL_REF:
-    case CONST :
-      return 1;
-    default:
-      return 0;
-    }
-}
-
-/* Return truth value of statement that OP is a symbolic memory
-   operand of mode MODE.  */
-
-int
-symbolic_memory_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
-{
-  if (GET_CODE (op) == SUBREG)
-    op = SUBREG_REG (op);
-  if (GET_CODE (op) != MEM)
-    return 0;
-  op = XEXP (op, 0);
-  return (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == CONST
-         || GET_CODE (op) == LABEL_REF);
-}
-
-/* Return true if OP is a short immediate (shimm) value.  */
-
-int
-short_immediate_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
-{
-  if (GET_CODE (op) != CONST_INT)
-    return 0;
-  return SMALL_INT (INTVAL (op));
-}
-
-/* Return true if OP will require a long immediate (limm) value.
-   This is currently only used when calculating length attributes.  */
-
-int
-long_immediate_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
-{
-  switch (GET_CODE (op))
-    {
-    case SYMBOL_REF :
-    case LABEL_REF :
-    case CONST :
-      return 1;
-    case CONST_INT :
-      return !SMALL_INT (INTVAL (op));
-    case CONST_DOUBLE :
-      /* These can happen because large unsigned 32-bit constants are
-        represented this way (the multiplication patterns can cause these
-        to be generated).  They also occur for SFmode values.  */
-      return 1;
-    default:
-      break;
-    }
-  return 0;
-}
-
-/* Return true if OP is a MEM that when used as a load or store address will
-   require an 8 byte insn.
-   Load and store instructions don't allow the same possibilities but they're
-   similar enough that this one function will do.
-   This is currently only used when calculating length attributes.  */
-
-int
-long_immediate_loadstore_operand (rtx op,
-                                  enum machine_mode mode ATTRIBUTE_UNUSED)
-{
-  if (GET_CODE (op) != MEM)
-    return 0;
-
-  op = XEXP (op, 0);
-  switch (GET_CODE (op))
-    {
-    case SYMBOL_REF :
-    case LABEL_REF :
-    case CONST :
-      return 1;
-    case CONST_INT :
-      /* This must be handled as "st c,[limm]".  Ditto for load.
-        Technically, the assembler could translate some possibilities to
-        "st c,[limm/2 + limm/2]" if limm/2 will fit in a shimm, but we don't
-        assume that it does.  */
-      return 1;
-    case CONST_DOUBLE :
-      /* These can happen because large unsigned 32-bit constants are
-        represented this way (the multiplication patterns can cause these
-        to be generated).  They also occur for SFmode values.  */
-      return 1;
-    case REG :
-      return 0;
-    case PLUS :
-      if (GET_CODE (XEXP (op, 1)) == CONST_INT
-         && !SMALL_INT (INTVAL (XEXP (op, 1))))
-       return 1;
-      return 0;
-    default:
-      break;
-    }
-  return 0;
-}
-
-/* Return true if OP is an acceptable argument for a single word
-   move source.  */
-
-int
-move_src_operand (rtx op, enum machine_mode mode)
-{
-  switch (GET_CODE (op))
-    {
-    case SYMBOL_REF :
-    case LABEL_REF :
-    case CONST :
-      return 1;
-    case CONST_INT :
-      return (LARGE_INT (INTVAL (op)));
-    case CONST_DOUBLE :
-      /* We can handle DImode integer constants in SImode if the value
-        (signed or unsigned) will fit in 32 bits.  This is needed because
-        large unsigned 32-bit constants are represented as CONST_DOUBLEs.  */
-      if (mode == SImode)
-       return arc_double_limm_p (op);
-      /* We can handle 32-bit floating point constants.  */
-      if (mode == SFmode)
-       return GET_MODE (op) == SFmode;
-      return 0;
-    case REG :
-      return register_operand (op, mode);
-    case SUBREG :
-      /* (subreg (mem ...) ...) can occur here if the inner part was once a
-        pseudo-reg and is now a stack slot.  */
-      if (GET_CODE (SUBREG_REG (op)) == MEM)
-       return address_operand (XEXP (SUBREG_REG (op), 0), mode);
-      else
-       return register_operand (op, mode);
-    case MEM :
-      return address_operand (XEXP (op, 0), mode);
-    default :
-      return 0;
-    }
-}
-
-/* Return true if OP is an acceptable argument for a double word
-   move source.  */
-
-int
-move_double_src_operand (rtx op, enum machine_mode mode)
-{
-  switch (GET_CODE (op))
-    {
-    case REG :
-      return register_operand (op, mode);
-    case SUBREG :
-      /* (subreg (mem ...) ...) can occur here if the inner part was once a
-        pseudo-reg and is now a stack slot.  */
-      if (GET_CODE (SUBREG_REG (op)) == MEM)
-       return move_double_src_operand (SUBREG_REG (op), mode);
-      else
-       return register_operand (op, mode);
-    case MEM :
-      /* Disallow auto inc/dec for now.  */
-      if (GET_CODE (XEXP (op, 0)) == PRE_DEC
-         || GET_CODE (XEXP (op, 0)) == PRE_INC)
-       return 0;
-      return address_operand (XEXP (op, 0), mode);
-    case CONST_INT :
-    case CONST_DOUBLE :
-      return 1;
-    default :
-      return 0;
-    }
-}
-
-/* Return true if OP is an acceptable argument for a move destination.  */
-
-int
-move_dest_operand (rtx op, enum machine_mode mode)
-{
-  switch (GET_CODE (op))
-    {
-    case REG :
-      return register_operand (op, mode);
-    case SUBREG :
-      /* (subreg (mem ...) ...) can occur here if the inner part was once a
-        pseudo-reg and is now a stack slot.  */
-      if (GET_CODE (SUBREG_REG (op)) == MEM)
-       return address_operand (XEXP (SUBREG_REG (op), 0), mode);
-      else
-       return register_operand (op, mode);
-    case MEM :
-      return address_operand (XEXP (op, 0), mode);
-    default :
-      return 0;
-    }
-}
-
-/* Return true if OP is valid load with update operand.  */
-
-int
-load_update_operand (rtx op, enum machine_mode mode)
-{
-  if (GET_CODE (op) != MEM
-      || GET_MODE (op) != mode)
-    return 0;
-  op = XEXP (op, 0);
-  if (GET_CODE (op) != PLUS
-      || GET_MODE (op) != Pmode
-      || !register_operand (XEXP (op, 0), Pmode)
-      || !nonmemory_operand (XEXP (op, 1), Pmode))
-    return 0;
-  return 1;
-}
-
-/* Return true if OP is valid store with update operand.  */
-
-int
-store_update_operand (rtx op, enum machine_mode mode)
-{
-  if (GET_CODE (op) != MEM
-      || GET_MODE (op) != mode)
-    return 0;
-  op = XEXP (op, 0);
-  if (GET_CODE (op) != PLUS
-      || GET_MODE (op) != Pmode
-      || !register_operand (XEXP (op, 0), Pmode)
-      || !(GET_CODE (XEXP (op, 1)) == CONST_INT
-          && SMALL_INT (INTVAL (XEXP (op, 1)))))
-    return 0;
-  return 1;
-}
-
-/* Return true if OP is a non-volatile non-immediate operand.
-   Volatile memory refs require a special "cache-bypass" instruction
-   and only the standard movXX patterns are set up to handle them.  */
-
-int
-nonvol_nonimm_operand (rtx op, enum machine_mode mode)
-{
-  if (GET_CODE (op) == MEM && MEM_VOLATILE_P (op))
-    return 0;
-  return nonimmediate_operand (op, mode);
-}
-
-/* Accept integer operands in the range -0x80000000..0x7fffffff.  We have
-   to check the range carefully since this predicate is used in DImode
-   contexts.  */
-
-int
-const_sint32_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
-{
-  /* All allowed constants will fit a CONST_INT.  */
-  return (GET_CODE (op) == CONST_INT
-         && (INTVAL (op) >= (-0x7fffffff - 1) && INTVAL (op) <= 0x7fffffff));
-}
-
-/* Accept integer operands in the range 0..0xffffffff.  We have to check the
-   range carefully since this predicate is used in DImode contexts.  Also, we
-   need some extra crud to make it work when hosted on 64-bit machines.  */
-
-int
-const_uint32_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
-{
-#if HOST_BITS_PER_WIDE_INT > 32
-  /* All allowed constants will fit a CONST_INT.  */
-  return (GET_CODE (op) == CONST_INT
-         && (INTVAL (op) >= 0 && INTVAL (op) <= 0xffffffffL));
-#else
-  return ((GET_CODE (op) == CONST_INT && INTVAL (op) >= 0)
-         || (GET_CODE (op) == CONST_DOUBLE && CONST_DOUBLE_HIGH (op) == 0));
-#endif
-}
-
-/* Return 1 if OP is a comparison operator valid for the mode of CC.
-   This allows the use of MATCH_OPERATOR to recognize all the branch insns.
-
-   Some insns only set a few bits in the condition code.  So only allow those
-   comparisons that use the bits that are valid.  */
-
-int
-proper_comparison_operator (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
-{
-  enum rtx_code code;
-  if (!COMPARISON_P (op))
-    return 0;
-
-  code = GET_CODE (op);
-  if (GET_MODE (XEXP (op, 0)) == CCZNmode)
-    return (code == EQ || code == NE);
-  if (GET_MODE (XEXP (op, 0)) == CCZNCmode)
-    return (code == EQ || code == NE
-           || code == LTU || code == GEU || code == GTU || code == LEU);
-  return 1;
-}
-\f
-/* Misc. utilities.  */
-
-/* X and Y are two things to compare using CODE.  Return the rtx
-   for the cc reg in the proper mode.  */
-
-rtx
-gen_compare_reg (enum rtx_code code, rtx x, rtx y)
-{
-  enum machine_mode mode = SELECT_CC_MODE (code, x, y);
-  return gen_rtx_REG (mode, 61);
-}
-
-/* Return 1 if VALUE, a const_double, will fit in a limm (4 byte number).
-   We assume the value can be either signed or unsigned.  */
-
-int
-arc_double_limm_p (rtx value)
-{
-  HOST_WIDE_INT low, high;
-
-  gcc_assert (GET_CODE (value) == CONST_DOUBLE);
-
-  low = CONST_DOUBLE_LOW (value);
-  high = CONST_DOUBLE_HIGH (value);
-
-  if (low & 0x80000000)
-    {
-      return (((unsigned HOST_WIDE_INT) low <= 0xffffffff && high == 0)
-             || (((low & - (unsigned HOST_WIDE_INT) 0x80000000)
-                  == - (unsigned HOST_WIDE_INT) 0x80000000)
-                 && high == -1));
-    }
-  else
-    {
-      return (unsigned HOST_WIDE_INT) low <= 0x7fffffff && high == 0;
-    }
-}
-\f
-/* Do any needed setup for a variadic function.  For the ARC, we must
-   create a register parameter block, and then copy any anonymous arguments
-   in registers to memory.
-
-   CUM has not been updated for the last named argument which has type TYPE
-   and mode MODE, and we rely on this fact.
-
-   We do things a little weird here.  We're supposed to only allocate space
-   for the anonymous arguments.  However we need to keep the stack eight byte
-   aligned.  So we round the space up if necessary, and leave it to va_start
-   to compensate.  */
-
-static void
-arc_setup_incoming_varargs (CUMULATIVE_ARGS *cum,
-                            enum machine_mode mode,
-                            tree type ATTRIBUTE_UNUSED,
-                            int *pretend_size,
-                            int no_rtl)
-{
-  int first_anon_arg;
-
-  /* All BLKmode values are passed by reference.  */
-  gcc_assert (mode != BLKmode);
-
-  first_anon_arg = *cum + ((GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1)
-                          / UNITS_PER_WORD);
-
-  if (first_anon_arg < MAX_ARC_PARM_REGS && !no_rtl)
-    {
-      /* Note that first_reg_offset < MAX_ARC_PARM_REGS.  */
-      int first_reg_offset = first_anon_arg;
-      /* Size in words to "pretend" allocate.  */
-      int size = MAX_ARC_PARM_REGS - first_reg_offset;
-      /* Extra slop to keep stack eight byte aligned.  */
-      int align_slop = size & 1;
-      rtx regblock;
-
-      regblock = gen_rtx_MEM (BLKmode,
-                             plus_constant (arg_pointer_rtx,
-                                            FIRST_PARM_OFFSET (0)
-                                            + align_slop * UNITS_PER_WORD));
-      set_mem_alias_set (regblock, get_varargs_alias_set ());
-      set_mem_align (regblock, BITS_PER_WORD);
-      move_block_from_reg (first_reg_offset, regblock,
-                          MAX_ARC_PARM_REGS - first_reg_offset);
-
-      *pretend_size = ((MAX_ARC_PARM_REGS - first_reg_offset + align_slop)
-                      * UNITS_PER_WORD);
-    }
-}
-\f
-/* Cost functions.  */
-
-/* Compute a (partial) cost for rtx X.  Return true if the complete
-   cost has been computed, and false if subexpressions should be
-   scanned.  In either case, *TOTAL contains the cost result.  */
-
-static bool
-arc_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED, int *total,
-              bool speed ATTRIBUTE_UNUSED)
-{
-  switch (code)
-    {
-      /* Small integers are as cheap as registers.  4 byte values can
-        be fetched as immediate constants - let's give that the cost
-        of an extra insn.  */
-    case CONST_INT:
-      if (SMALL_INT (INTVAL (x)))
-       {
-         *total = 0;
-         return true;
-       }
-      /* FALLTHRU */
-
-    case CONST:
-    case LABEL_REF:
-    case SYMBOL_REF:
-      *total = COSTS_N_INSNS (1);
-      return true;
-
-    case CONST_DOUBLE:
-      {
-        rtx high, low;
-        split_double (x, &high, &low);
-       *total = COSTS_N_INSNS (!SMALL_INT (INTVAL (high))
-                               + !SMALL_INT (INTVAL (low)));
-       return true;
-      }
-
-    /* Encourage synth_mult to find a synthetic multiply when reasonable.
-       If we need more than 12 insns to do a multiply, then go out-of-line,
-       since the call overhead will be < 10% of the cost of the multiply.  */
-    case ASHIFT:
-    case ASHIFTRT:
-    case LSHIFTRT:
-      if (TARGET_SHIFTER)
-        *total = COSTS_N_INSNS (1);
-      else if (GET_CODE (XEXP (x, 1)) != CONST_INT)
-        *total = COSTS_N_INSNS (16);
-      else
-        *total = COSTS_N_INSNS (INTVAL (XEXP ((x), 1)));
-      return false;
-
-    default:
-      return false;
-    }
-}
-
-
-/* Provide the costs of an addressing mode that contains ADDR.
-   If ADDR is not a valid address, its cost is irrelevant.  */
-
-static int
-arc_address_cost (rtx addr, bool speed ATTRIBUTE_UNUSED)
-{
-  switch (GET_CODE (addr))
-    {
-    case REG :
-      return 1;
-
-    case LABEL_REF :
-    case SYMBOL_REF :
-    case CONST :
-      return 2;
-
-    case PLUS :
-      {
-       register rtx plus0 = XEXP (addr, 0);
-       register rtx plus1 = XEXP (addr, 1);
-
-       if (GET_CODE (plus0) != REG)
-         break;
-
-       switch (GET_CODE (plus1))
-         {
-         case CONST_INT :
-           return SMALL_INT (INTVAL (plus1)) ? 1 : 2;
-         case CONST :
-         case SYMBOL_REF :
-         case LABEL_REF :
-           return 2;
-         default:
-           break;
-         }
-       break;
-      }
-    default:
-      break;
-    }
-
-  return 4;
-}
-\f
-/* Function prologue/epilogue handlers.  */
-
-/* ARC stack frames look like:
-
-             Before call                       After call
-        +-----------------------+       +-----------------------+
-        |                       |       |                       |
-   high |  local variables,     |       |  local variables,     |
-   mem  |  reg save area, etc.  |       |  reg save area, etc.  |
-        |                       |       |                       |
-        +-----------------------+       +-----------------------+
-        |                       |       |                       |
-        |  arguments on stack.  |       |  arguments on stack.  |
-        |                       |       |                       |
- SP+16->+-----------------------+FP+48->+-----------------------+
-        | 4 word save area for  |       |  reg parm save area,  |
-        | return addr, prev %fp |       |  only created for     |    
-  SP+0->+-----------------------+       |  variable argument    |    
-                                        |  functions            |    
-                                 FP+16->+-----------------------+    
-                                        | 4 word save area for  |    
-                                        | return addr, prev %fp |    
-                                  FP+0->+-----------------------+    
-                                        |                       |    
-                                        |  local variables      |    
-                                        |                       |    
-                                        +-----------------------+    
-                                        |                       |    
-                                        |  register save area   |    
-                                        |                       |    
-                                        +-----------------------+    
-                                        |                       |    
-                                        |  alloca allocations   |    
-                                        |                       |    
-                                        +-----------------------+    
-                                        |                       |    
-                                        |  arguments on stack   |    
-                                        |                       |    
-                                 SP+16->+-----------------------+
-   low                                  | 4 word save area for  |    
-   memory                               | return addr, prev %fp |    
-                                  SP+0->+-----------------------+    
-
-Notes:
-1) The "reg parm save area" does not exist for non variable argument fns.
-   The "reg parm save area" can be eliminated completely if we created our
-   own va-arc.h, but that has tradeoffs as well (so it's not done).  */
-
-/* Structure to be filled in by arc_compute_frame_size with register
-   save masks, and offsets for the current function.  */
-struct arc_frame_info
-{
-  unsigned int total_size;     /* # bytes that the entire frame takes up.  */
-  unsigned int extra_size;     /* # bytes of extra stuff.  */
-  unsigned int pretend_size;   /* # bytes we push and pretend caller did.  */
-  unsigned int args_size;      /* # bytes that outgoing arguments take up.  */
-  unsigned int reg_size;       /* # bytes needed to store regs.  */
-  unsigned int var_size;       /* # bytes that variables take up.  */
-  unsigned int reg_offset;     /* Offset from new sp to store regs.  */
-  unsigned int gmask;          /* Mask of saved gp registers.  */
-  int          initialized;    /* Nonzero if frame size already calculated.  */
-};
-
-/* Current frame information calculated by arc_compute_frame_size.  */
-static struct arc_frame_info current_frame_info;
-
-/* Zero structure to initialize current_frame_info.  */
-static struct arc_frame_info zero_frame_info;
-
-/* Type of function DECL.
-
-   The result is cached.  To reset the cache at the end of a function,
-   call with DECL = NULL_TREE.  */
-
-enum arc_function_type
-arc_compute_function_type (tree decl)
-{
-  tree a;
-  /* Cached value.  */
-  static enum arc_function_type fn_type = ARC_FUNCTION_UNKNOWN;
-  /* Last function we were called for.  */
-  static tree last_fn = NULL_TREE;
-
-  /* Resetting the cached value?  */
-  if (decl == NULL_TREE)
-    {
-      fn_type = ARC_FUNCTION_UNKNOWN;
-      last_fn = NULL_TREE;
-      return fn_type;
-    }
-
-  if (decl == last_fn && fn_type != ARC_FUNCTION_UNKNOWN)
-    return fn_type;
-
-  /* Assume we have a normal function (not an interrupt handler).  */
-  fn_type = ARC_FUNCTION_NORMAL;
-
-  /* Now see if this is an interrupt handler.  */
-  for (a = DECL_ATTRIBUTES (current_function_decl);
-       a;
-       a = TREE_CHAIN (a))
-    {
-      tree name = TREE_PURPOSE (a), args = TREE_VALUE (a);
-
-      if (name == get_identifier ("__interrupt__")
-         && list_length (args) == 1
-         && TREE_CODE (TREE_VALUE (args)) == STRING_CST)
-       {
-         tree value = TREE_VALUE (args);
-
-         if (!strcmp (TREE_STRING_POINTER (value), "ilink1"))
-           fn_type = ARC_FUNCTION_ILINK1;
-         else if (!strcmp (TREE_STRING_POINTER (value), "ilink2"))
-           fn_type = ARC_FUNCTION_ILINK2;
-         else
-           gcc_unreachable ();
-         break;
-       }
-    }
-
-  last_fn = decl;
-  return fn_type;
-}
-
-#define ILINK1_REGNUM 29
-#define ILINK2_REGNUM 30
-#define RETURN_ADDR_REGNUM 31
-#define FRAME_POINTER_MASK (1 << (FRAME_POINTER_REGNUM))
-#define RETURN_ADDR_MASK (1 << (RETURN_ADDR_REGNUM))
-
-/* Tell prologue and epilogue if register REGNO should be saved / restored.
-   The return address and frame pointer are treated separately.
-   Don't consider them here.  */
-#define MUST_SAVE_REGISTER(regno, interrupt_p) \
-((regno) != RETURN_ADDR_REGNUM && (regno) != FRAME_POINTER_REGNUM \
- && (df_regs_ever_live_p (regno) && (!call_used_regs[regno] || interrupt_p)))
-
-#define MUST_SAVE_RETURN_ADDR (df_regs_ever_live_p (RETURN_ADDR_REGNUM))
-
-/* Return the bytes needed to compute the frame pointer from the current
-   stack pointer.
-
-   SIZE is the size needed for local variables.  */
-
-unsigned int
-arc_compute_frame_size (int size /* # of var. bytes allocated.  */)
-{
-  int regno;
-  unsigned int total_size, var_size, args_size, pretend_size, extra_size;
-  unsigned int reg_size, reg_offset;
-  unsigned int gmask;
-  enum arc_function_type fn_type;
-  int interrupt_p;
-
-  var_size     = size;
-  args_size    = crtl->outgoing_args_size;
-  pretend_size = crtl->args.pretend_args_size;
-  extra_size   = FIRST_PARM_OFFSET (0);
-  total_size   = extra_size + pretend_size + args_size + var_size;
-  reg_offset   = FIRST_PARM_OFFSET(0) + crtl->outgoing_args_size;
-  reg_size     = 0;
-  gmask                = 0;
-
-  /* See if this is an interrupt handler.  Call used registers must be saved
-     for them too.  */
-  fn_type = arc_compute_function_type (current_function_decl);
-  interrupt_p = ARC_INTERRUPT_P (fn_type);
-
-  /* Calculate space needed for registers.
-     ??? We ignore the extension registers for now.  */
-
-  for (regno = 0; regno <= 31; regno++)
-    {
-      if (MUST_SAVE_REGISTER (regno, interrupt_p))
-       {
-         reg_size += UNITS_PER_WORD;
-         gmask |= 1 << regno;
-       }
-    }
-
-  total_size += reg_size;
-
-  /* If the only space to allocate is the fp/blink save area this is an
-     empty frame.  However, if we'll be making a function call we need to
-     allocate a stack frame for our callee's fp/blink save area.  */
-  if (total_size == extra_size
-      && !MUST_SAVE_RETURN_ADDR)
-    total_size = extra_size = 0;
-
-  total_size = ARC_STACK_ALIGN (total_size);
-
-  /* Save computed information.  */
-  current_frame_info.total_size   = total_size;
-  current_frame_info.extra_size   = extra_size;
-  current_frame_info.pretend_size = pretend_size;
-  current_frame_info.var_size     = var_size;
-  current_frame_info.args_size    = args_size;
-  current_frame_info.reg_size    = reg_size;
-  current_frame_info.reg_offset          = reg_offset;
-  current_frame_info.gmask       = gmask;
-  current_frame_info.initialized  = reload_completed;
-
-  /* Ok, we're done.  */
-  return total_size;
-}
-\f
-/* Common code to save/restore registers.  */
-
-void
-arc_save_restore (FILE *file,
-                  const char *base_reg,
-                  unsigned int offset,
-                  unsigned int gmask,
-                  const char *op)
-{
-  int regno;
-
-  if (gmask == 0)
-    return;
-
-  for (regno = 0; regno <= 31; regno++)
-    {
-      if ((gmask & (1L << regno)) != 0)
-       {
-         fprintf (file, "\t%s %s,[%s,%d]\n",
-                    op, reg_names[regno], base_reg, offset);
-         offset += UNITS_PER_WORD;
-       }
-    }
-}
-\f
-/* Target hook to assemble an integer object.  The ARC version needs to
-   emit a special directive for references to labels and function
-   symbols.  */
-
-static bool
-arc_assemble_integer (rtx x, unsigned int size, int aligned_p)
-{
-  if (size == UNITS_PER_WORD && aligned_p
-      && ((GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_FUNCTION_P (x))
-         || GET_CODE (x) == LABEL_REF))
-    {
-      fputs ("\t.word\t%st(", asm_out_file);
-      output_addr_const (asm_out_file, x);
-      fputs (")\n", asm_out_file);
-      return true;
-    }
-  return default_assemble_integer (x, size, aligned_p);
-}
-\f
-/* Set up the stack and frame pointer (if desired) for the function.  */
-
-static void
-arc_output_function_prologue (FILE *file, HOST_WIDE_INT size)
-{
-  const char *sp_str = reg_names[STACK_POINTER_REGNUM];
-  const char *fp_str = reg_names[FRAME_POINTER_REGNUM];
-  unsigned int gmask = current_frame_info.gmask;
-  enum arc_function_type fn_type = arc_compute_function_type (current_function_decl);
-
-  /* If this is an interrupt handler, set up our stack frame.
-     ??? Optimize later.  */
-  if (ARC_INTERRUPT_P (fn_type))
-    {
-      fprintf (file, "\t%s interrupt handler\n",
-              ASM_COMMENT_START);
-      fprintf (file, "\tsub %s,%s,16\n", sp_str, sp_str);
-    }
-
-  /* This is only for the human reader.  */
-  fprintf (file, "\t%s BEGIN PROLOGUE %s vars= %d, regs= %d, args= %d, extra= %d\n",
-          ASM_COMMENT_START, ASM_COMMENT_START,
-          current_frame_info.var_size,
-          current_frame_info.reg_size / 4,
-          current_frame_info.args_size,
-          current_frame_info.extra_size);
-
-  size = ARC_STACK_ALIGN (size);
-  size = (! current_frame_info.initialized
-          ? arc_compute_frame_size (size)
-          : current_frame_info.total_size);
-
-  /* These cases shouldn't happen.  Catch them now.  */
-  gcc_assert (size || !gmask);
-
-  /* Allocate space for register arguments if this is a variadic function.  */
-  if (current_frame_info.pretend_size != 0)
-    fprintf (file, "\tsub %s,%s,%d\n",
-            sp_str, sp_str, current_frame_info.pretend_size);
-
-  /* The home-grown ABI says link register is saved first.  */
-  if (MUST_SAVE_RETURN_ADDR)
-    fprintf (file, "\tst %s,[%s,%d]\n",
-            reg_names[RETURN_ADDR_REGNUM], sp_str, UNITS_PER_WORD);
-
-  /* Set up the previous frame pointer next (if we need to).  */
-  if (frame_pointer_needed)
-    {
-      fprintf (file, "\tst %s,[%s]\n", fp_str, sp_str);
-      fprintf (file, "\tmov %s,%s\n", fp_str, sp_str);
-    }
-
-  /* ??? We don't handle the case where the saved regs are more than 252
-     bytes away from sp.  This can be handled by decrementing sp once, saving
-     the regs, and then decrementing it again.  The epilogue doesn't have this
-     problem as the `ld' insn takes reg+limm values (though it would be more
-     efficient to avoid reg+limm).  */
-
-  /* Allocate the stack frame.  */
-  if (size - current_frame_info.pretend_size > 0)
-    fprintf (file, "\tsub %s,%s," HOST_WIDE_INT_PRINT_DEC "\n",
-            sp_str, sp_str, size - current_frame_info.pretend_size);
-
-  /* Save any needed call-saved regs (and call-used if this is an
-     interrupt handler).  */
-  arc_save_restore (file, sp_str, current_frame_info.reg_offset,
-                   /* The zeroing of these two bits is unnecessary,
-                      but leave this in for clarity.  */
-                   gmask & ~(FRAME_POINTER_MASK | RETURN_ADDR_MASK),
-                   "st");
-
-  fprintf (file, "\t%s END PROLOGUE\n", ASM_COMMENT_START);
-}
-\f
-/* Do any necessary cleanup after a function to restore stack, frame,
-   and regs.  */
-
-static void
-arc_output_function_epilogue (FILE *file, HOST_WIDE_INT size)
-{
-  rtx epilogue_delay = crtl->epilogue_delay_list;
-  int noepilogue = FALSE;
-  enum arc_function_type fn_type = arc_compute_function_type (current_function_decl);
-
-  /* This is only for the human reader.  */
-  fprintf (file, "\t%s EPILOGUE\n", ASM_COMMENT_START);
-
-  size = ARC_STACK_ALIGN (size);
-  size = (!current_frame_info.initialized
-          ? arc_compute_frame_size (size)
-          : current_frame_info.total_size);
-
-  if (size == 0 && epilogue_delay == 0)
-    {
-      rtx insn = get_last_insn ();
-
-      /* If the last insn was a BARRIER, we don't have to write any code
-        because a jump (aka return) was put there.  */
-      if (GET_CODE (insn) == NOTE)
-       insn = prev_nonnote_insn (insn);
-      if (insn && GET_CODE (insn) == BARRIER)
-       noepilogue = TRUE;
-    }
-
-  if (!noepilogue)
-    {
-      unsigned int pretend_size = current_frame_info.pretend_size;
-      unsigned int frame_size = size - pretend_size;
-      int restored, fp_restored_p;
-      int can_trust_sp_p = !cfun->calls_alloca;
-      const char *sp_str = reg_names[STACK_POINTER_REGNUM];
-      const char *fp_str = reg_names[FRAME_POINTER_REGNUM];
-
-      /* ??? There are lots of optimizations that can be done here.
-        EG: Use fp to restore regs if it's closer.
-        Maybe in time we'll do them all.  For now, always restore regs from
-        sp, but don't restore sp if we don't have to.  */
-
-      if (!can_trust_sp_p)
-       {
-         gcc_assert (frame_pointer_needed);
-         fprintf (file,"\tsub %s,%s,%d\t\t%s sp not trusted here\n",
-                  sp_str, fp_str, frame_size, ASM_COMMENT_START);
-       }
-
-      /* Restore any saved registers.  */
-      arc_save_restore (file, sp_str, current_frame_info.reg_offset,
-                       /* The zeroing of these two bits is unnecessary,
-                          but leave this in for clarity.  */
-                       current_frame_info.gmask & ~(FRAME_POINTER_MASK | RETURN_ADDR_MASK),
-                       "ld");
-
-      if (MUST_SAVE_RETURN_ADDR)
-       fprintf (file, "\tld %s,[%s,%d]\n",
-                reg_names[RETURN_ADDR_REGNUM],
-                frame_pointer_needed ? fp_str : sp_str,
-                UNITS_PER_WORD + (frame_pointer_needed ? 0 : frame_size));
-
-      /* Keep track of how much of the stack pointer we've restored.
-        It makes the following a lot more readable.  */
-      restored = 0;
-      fp_restored_p = 0;
-
-      /* We try to emit the epilogue delay slot insn right after the load
-        of the return address register so that it can execute with the
-        stack intact.  Secondly, loads are delayed.  */
-      /* ??? If stack intactness is important, always emit now.  */
-      if (MUST_SAVE_RETURN_ADDR && epilogue_delay != NULL_RTX)
-       {
-         final_scan_insn (XEXP (epilogue_delay, 0), file, 1, 1, NULL);
-         epilogue_delay = NULL_RTX;
-       }
-
-      if (frame_pointer_needed)
-       {
-         /* Try to restore the frame pointer in the delay slot.  We can't,
-            however, if any of these is true.  */
-         if (epilogue_delay != NULL_RTX
-             || !SMALL_INT (frame_size)
-             || pretend_size
-             || ARC_INTERRUPT_P (fn_type))
-           {
-             /* Note that we restore fp and sp here!  */
-             fprintf (file, "\tld.a %s,[%s,%d]\n", fp_str, sp_str, frame_size);
-             restored += frame_size;
-             fp_restored_p = 1;
-           }
-       }
-      else if (!SMALL_INT (size /* frame_size + pretend_size */)
-              || ARC_INTERRUPT_P (fn_type))
-       {
-         fprintf (file, "\tadd %s,%s,%d\n", sp_str, sp_str, frame_size);
-         restored += frame_size;
-       }
-
-      /* These must be done before the return insn because the delay slot
-        does the final stack restore.  */
-      if (ARC_INTERRUPT_P (fn_type))
-       {
-         if (epilogue_delay)
-           {
-             final_scan_insn (XEXP (epilogue_delay, 0), file, 1, 1, NULL);
-           }
-       }
-
-      /* Emit the return instruction.  */
-      {
-       static const int regs[4] = {
-         0, RETURN_ADDR_REGNUM, ILINK1_REGNUM, ILINK2_REGNUM
-       };
-
-       /* Update the flags, if returning from an interrupt handler. */
-       if (ARC_INTERRUPT_P (fn_type))
-         fprintf (file, "\tj.d.f %s\n", reg_names[regs[fn_type]]);
-       else
-         fprintf (file, "\tj.d %s\n", reg_names[regs[fn_type]]);
-       }
-
-      /* If the only register saved is the return address, we need a
-        nop, unless we have an instruction to put into it.  Otherwise
-        we don't since reloading multiple registers doesn't reference
-        the register being loaded.  */
-
-      if (ARC_INTERRUPT_P (fn_type))
-       fprintf (file, "\tadd %s,%s,16\n", sp_str, sp_str);
-      else if (epilogue_delay != NULL_RTX)
-       {
-         gcc_assert (!frame_pointer_needed || fp_restored_p);
-         gcc_assert (restored >= size);
-         final_scan_insn (XEXP (epilogue_delay, 0), file, 1, 1, NULL);
-       }
-      else if (frame_pointer_needed && !fp_restored_p)
-       {
-         gcc_assert (SMALL_INT (frame_size));
-         /* Note that we restore fp and sp here!  */
-         fprintf (file, "\tld.a %s,[%s,%d]\n", fp_str, sp_str, frame_size);
-       }
-      else if (restored < size)
-       {
-         gcc_assert (SMALL_INT (size - restored));
-         fprintf (file, "\tadd %s,%s," HOST_WIDE_INT_PRINT_DEC "\n",
-                  sp_str, sp_str, size - restored);
-       }
-      else
-       fprintf (file, "\tnop\n");
-    }
-
-  /* Reset state info for each function.  */
-  current_frame_info = zero_frame_info;
-  arc_compute_function_type (NULL_TREE);
-}
-\f
-/* Define the number of delay slots needed for the function epilogue.
-
-   Interrupt handlers can't have any epilogue delay slots (it's always needed
-   for something else, I think).  For normal functions, we have to worry about
-   using call-saved regs as they'll be restored before the delay slot insn.
-   Functions with non-empty frames already have enough choices for the epilogue
-   delay slot so for now we only consider functions with empty frames.  */
-
-int
-arc_delay_slots_for_epilogue (void)
-{
-  if (arc_compute_function_type (current_function_decl) != ARC_FUNCTION_NORMAL)
-    return 0;
-  if (!current_frame_info.initialized)
-    (void) arc_compute_frame_size (get_frame_size ());
-  if (current_frame_info.total_size == 0)
-    return 1;
-  return 0;
-}
-
-/* Return true if TRIAL is a valid insn for the epilogue delay slot.
-   Any single length instruction which doesn't reference the stack or frame
-   pointer or any call-saved register is OK.  SLOT will always be 0.  */
-
-int
-arc_eligible_for_epilogue_delay (rtx trial, int slot)
-{
-  gcc_assert (!slot);
-
-  if (get_attr_length (trial) == 1
-      /* If registers where saved, presumably there's more than enough
-        possibilities for the delay slot.  The alternative is something
-        more complicated (of course, if we expanded the epilogue as rtl
-        this problem would go away).  */
-      /* ??? Note that this will always be true since only functions with
-        empty frames have epilogue delay slots.  See
-        arc_delay_slots_for_epilogue.  */
-      && current_frame_info.gmask == 0
-      && ! reg_mentioned_p (stack_pointer_rtx, PATTERN (trial))
-      && ! reg_mentioned_p (frame_pointer_rtx, PATTERN (trial)))
-    return 1;
-  return 0;
-}
-\f
-/* Return true if OP is a shift operator.  */
-
-int
-shift_operator (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
-{
-  switch (GET_CODE (op))
-    {
-    case ASHIFTRT:
-    case LSHIFTRT:
-    case ASHIFT:
-      return 1;
-    default:
-      return 0;
-    }
-}
-
-/* Output the assembler code for doing a shift.
-   We go to a bit of trouble to generate efficient code as the ARC only has
-   single bit shifts.  This is taken from the h8300 port.  We only have one
-   mode of shifting and can't access individual bytes like the h8300 can, so
-   this is greatly simplified (at the expense of not generating hyper-
-   efficient code).
-
-   This function is not used if the variable shift insns are present.  */
-
-/* ??? We assume the output operand is the same as operand 1.
-   This can be optimized (deleted) in the case of 1 bit shifts.  */
-/* ??? We use the loop register here.  We don't use it elsewhere (yet) and
-   using it here will give us a chance to play with it.  */
-
-const char *
-output_shift (rtx *operands)
-{
-  rtx shift = operands[3];
-  enum machine_mode mode = GET_MODE (shift);
-  enum rtx_code code = GET_CODE (shift);
-  const char *shift_one;
-
-  gcc_assert (mode == SImode);
-
-  switch (code)
-    {
-    case ASHIFT:   shift_one = "asl %0,%0"; break;
-    case ASHIFTRT: shift_one = "asr %0,%0"; break;
-    case LSHIFTRT: shift_one = "lsr %0,%0"; break;
-    default:       gcc_unreachable ();
-    }
-
-  if (GET_CODE (operands[2]) != CONST_INT)
-    {
-      if (optimize)
-       {
-         output_asm_insn ("sub.f 0,%2,0", operands);
-         output_asm_insn ("mov lp_count,%2", operands);
-         output_asm_insn ("bz 2f", operands);
-       }
-      else
-       output_asm_insn ("mov %4,%2", operands);
-      goto shiftloop;
-    }
-  else
-    {
-      int n;
-
-      /* If the count is negative, make it 0.  */
-      n = INTVAL (operands[2]);
-      if (n < 0)
-       n = 0;
-      /* If the count is too big, truncate it.
-         ANSI says shifts of GET_MODE_BITSIZE are undefined - we choose to
-        do the intuitive thing.  */
-      else if (n > GET_MODE_BITSIZE (mode))
-       n = GET_MODE_BITSIZE (mode);
-
-      /* First see if we can do them inline.  */
-      if (n <= 8)
-       {
-         while (--n >= 0)
-           output_asm_insn (shift_one, operands);
-       }
-      /* See if we can use a rotate/and.  */
-      else if (n == BITS_PER_WORD - 1)
-       {
-         switch (code)
-           {
-           case ASHIFT :
-             output_asm_insn ("and %0,%0,1\n\tror %0,%0", operands);
-             break;
-           case ASHIFTRT :
-             /* The ARC doesn't have a rol insn.  Use something else.  */
-             output_asm_insn ("asl.f 0,%0\n\tsbc %0,0,0", operands);
-             break;
-           case LSHIFTRT :
-             /* The ARC doesn't have a rol insn.  Use something else.  */
-             output_asm_insn ("asl.f 0,%0\n\tadc %0,0,0", operands);
-             break;
-           default:
-             break;
-           }
-       }
-      /* Must loop.  */
-      else
-       {
-         char buf[100];
-
-         if (optimize)
-           output_asm_insn ("mov lp_count,%c2", operands);
-         else
-           output_asm_insn ("mov %4,%c2", operands);
-       shiftloop:
-         if (optimize)
-           {
-             if (flag_pic)
-               sprintf (buf, "lr %%4,[status]\n\tadd %%4,%%4,6\t%s single insn loop start",
-                        ASM_COMMENT_START);
-             else
-               sprintf (buf, "mov %%4,%%%%st(1f)\t%s (single insn loop start) >> 2",
-                        ASM_COMMENT_START);
-             output_asm_insn (buf, operands);
-             output_asm_insn ("sr %4,[lp_start]", operands);
-             output_asm_insn ("add %4,%4,1", operands);
-             output_asm_insn ("sr %4,[lp_end]", operands);
-             output_asm_insn ("nop\n\tnop", operands);
-             if (flag_pic)
-               fprintf (asm_out_file, "\t%s single insn loop\n",
-                        ASM_COMMENT_START);
-             else
-               fprintf (asm_out_file, "1:\t%s single insn loop\n",
-                        ASM_COMMENT_START);
-             output_asm_insn (shift_one, operands);
-             fprintf (asm_out_file, "2:\t%s end single insn loop\n",
-                      ASM_COMMENT_START);
-           }
-         else 
-           {
-             fprintf (asm_out_file, "1:\t%s begin shift loop\n",
-                      ASM_COMMENT_START);
-             output_asm_insn ("sub.f %4,%4,1", operands);
-             output_asm_insn ("nop", operands);
-             output_asm_insn ("bn.nd 2f", operands);
-             output_asm_insn (shift_one, operands);
-             output_asm_insn ("b.nd 1b", operands);
-             fprintf (asm_out_file, "2:\t%s end shift loop\n",
-                      ASM_COMMENT_START);
-           }
-       }
-    }
-
-  return "";
-}
-\f
-/* Nested function support.  */
-
-/* Emit RTL insns to initialize the variable parts of a trampoline.
-   FNADDR is an RTX for the address of the function's pure code.
-   CXT is an RTX for the static chain value for the function.  */
-
-void
-arc_initialize_trampoline (rtx tramp ATTRIBUTE_UNUSED,
-                           rtx fnaddr ATTRIBUTE_UNUSED,
-                           rtx cxt ATTRIBUTE_UNUSED)
-{
-}
-\f
-/* Set the cpu type and print out other fancy things,
-   at the top of the file.  */
-
-static void
-arc_file_start (void)
-{
-  default_file_start ();
-  fprintf (asm_out_file, "\t.cpu %s\n", arc_cpu_string);
-}
-\f
-/* Print operand X (an rtx) in assembler syntax to file FILE.
-   CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
-   For `%' followed by punctuation, CODE is the punctuation and X is null.  */
-
-void
-arc_print_operand (FILE *file, rtx x, int code)
-{
-  switch (code)
-    {
-    case '#' :
-      /* Conditional branches.  For now these are equivalent.  */
-    case '*' :
-      /* Unconditional branches.  Output the appropriate delay slot suffix.  */
-      if (!final_sequence || XVECLEN (final_sequence, 0) == 1)
-       {
-         /* There's nothing in the delay slot.  */
-         fputs (".nd", file);
-       }
-      else
-       {
-         rtx jump = XVECEXP (final_sequence, 0, 0);
-         rtx delay = XVECEXP (final_sequence, 0, 1);
-         if (INSN_ANNULLED_BRANCH_P (jump))
-           fputs (INSN_FROM_TARGET_P (delay) ? ".jd" : ".nd", file);
-         else
-           fputs (".d", file);
-       }
-      return;
-    case '?' : /* with leading "." */
-    case '!' : /* without leading "." */
-      /* This insn can be conditionally executed.  See if the ccfsm machinery
-        says it should be conditionalized.  */
-      if (arc_ccfsm_state == 3 || arc_ccfsm_state == 4)
-       {
-         /* Is this insn in a delay slot?  */
-         if (final_sequence && XVECLEN (final_sequence, 0) == 2)
-           {
-             rtx insn = XVECEXP (final_sequence, 0, 1);
-
-             /* If the insn is annulled and is from the target path, we need
-                to inverse the condition test.  */
-             if (INSN_ANNULLED_BRANCH_P (insn))
-               {
-                 if (INSN_FROM_TARGET_P (insn))
-                   fprintf (file, "%s%s",
-                            code == '?' ? "." : "",
-                            arc_condition_codes[ARC_INVERSE_CONDITION_CODE (arc_ccfsm_current_cc)]);
-                 else
-                   fprintf (file, "%s%s",
-                            code == '?' ? "." : "",
-                            arc_condition_codes[arc_ccfsm_current_cc]);
-               }
-             else
-               {
-                 /* This insn is executed for either path, so don't
-                    conditionalize it at all.  */
-                 ; /* nothing to do */
-               }
-           }
-         else
-           {
-             /* This insn isn't in a delay slot.  */
-             fprintf (file, "%s%s",
-                      code == '?' ? "." : "",
-                      arc_condition_codes[arc_ccfsm_current_cc]);
-           }
-       }
-      return;
-    case '~' :
-      /* Output a nop if we're between a set of the condition codes,
-        and a conditional branch.  */
-      if (last_insn_set_cc_p)
-       fputs ("nop\n\t", file);
-      return;
-    case 'd' :
-      fputs (arc_condition_codes[get_arc_condition_code (x)], file);
-      return;
-    case 'D' :
-      fputs (arc_condition_codes[ARC_INVERSE_CONDITION_CODE
-                                (get_arc_condition_code (x))],
-            file);
-      return;
-    case 'R' :
-      /* Write second word of DImode or DFmode reference,
-        register or memory.  */
-      if (GET_CODE (x) == REG)
-       fputs (reg_names[REGNO (x)+1], file);
-      else if (GET_CODE (x) == MEM)
-       {
-         fputc ('[', file);
-         /* Handle possible auto-increment.  Since it is pre-increment and
-            we have already done it, we can just use an offset of four.  */
-         /* ??? This is taken from rs6000.c I think.  I don't think it is
-            currently necessary, but keep it around.  */
-         if (GET_CODE (XEXP (x, 0)) == PRE_INC
-             || GET_CODE (XEXP (x, 0)) == PRE_DEC)
-           output_address (plus_constant (XEXP (XEXP (x, 0), 0), 4));
-         else
-           output_address (plus_constant (XEXP (x, 0), 4));
-         fputc (']', file);
-       }
-      else
-       output_operand_lossage ("invalid operand to %%R code");
-      return;
-    case 'S' :
-      if ((GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_FUNCTION_P (x))
-         || GET_CODE (x) == LABEL_REF)
-       {
-         fprintf (file, "%%st(");
-         output_addr_const (file, x);
-         fprintf (file, ")");
-         return;
-       }
-      break;
-    case 'H' :
-    case 'L' :
-      if (GET_CODE (x) == REG)
-       {
-         /* L = least significant word, H = most significant word */
-         if ((TARGET_BIG_ENDIAN != 0) ^ (code == 'L'))
-           fputs (reg_names[REGNO (x)], file);
-         else
-           fputs (reg_names[REGNO (x)+1], file);
-       }
-      else if (GET_CODE (x) == CONST_INT
-              || GET_CODE (x) == CONST_DOUBLE)
-       {
-         rtx first, second;
-
-         split_double (x, &first, &second);
-         fprintf (file, "0x%08lx",
-                  (long)(code == 'L' ? INTVAL (first) : INTVAL (second)));
-       }
-      else
-       output_operand_lossage ("invalid operand to %%H/%%L code");
-      return;
-    case 'A' :
-      {
-       char str[30];
-
-       gcc_assert (GET_CODE (x) == CONST_DOUBLE
-                   && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT);
-
-       real_to_decimal (str, CONST_DOUBLE_REAL_VALUE (x), sizeof (str), 0, 1);
-       fprintf (file, "%s", str);
-       return;
-      }
-    case 'U' :
-      /* Output a load/store with update indicator if appropriate.  */
-      if (GET_CODE (x) == MEM)
-       {
-         if (GET_CODE (XEXP (x, 0)) == PRE_INC
-             || GET_CODE (XEXP (x, 0)) == PRE_DEC)
-           fputs (".a", file);
-       }
-      else
-       output_operand_lossage ("invalid operand to %%U code");
-      return;
-    case 'V' :
-      /* Output cache bypass indicator for a load/store insn.  Volatile memory
-        refs are defined to use the cache bypass mechanism.  */
-      if (GET_CODE (x) == MEM)
-       {
-         if (MEM_VOLATILE_P (x))
-           fputs (".di", file);
-       }
-      else
-       output_operand_lossage ("invalid operand to %%V code");
-      return;
-    case 0 :
-      /* Do nothing special.  */
-      break;
-    default :
-      /* Unknown flag.  */
-      output_operand_lossage ("invalid operand output code");
-    }
-
-  switch (GET_CODE (x))
-    {
-    case REG :
-      fputs (reg_names[REGNO (x)], file);
-      break;
-    case MEM :
-      fputc ('[', file);
-      if (GET_CODE (XEXP (x, 0)) == PRE_INC)
-       output_address (plus_constant (XEXP (XEXP (x, 0), 0),
-                                      GET_MODE_SIZE (GET_MODE (x))));
-      else if (GET_CODE (XEXP (x, 0)) == PRE_DEC)
-       output_address (plus_constant (XEXP (XEXP (x, 0), 0),
-                                      - GET_MODE_SIZE (GET_MODE (x))));
-      else
-       output_address (XEXP (x, 0));
-      fputc (']', file);
-      break;
-    case CONST_DOUBLE :
-      /* We handle SFmode constants here as output_addr_const doesn't.  */
-      if (GET_MODE (x) == SFmode)
-       {
-         REAL_VALUE_TYPE d;
-         long l;
-
-         REAL_VALUE_FROM_CONST_DOUBLE (d, x);
-         REAL_VALUE_TO_TARGET_SINGLE (d, l);
-         fprintf (file, "0x%08lx", l);
-         break;
-       }
-      /* Fall through.  Let output_addr_const deal with it.  */
-    default :
-      output_addr_const (file, x);
-      break;
-    }
-}
-
-/* Print a memory address as an operand to reference that memory location.  */
-
-void
-arc_print_operand_address (FILE *file, rtx addr)
-{
-  register rtx base, index = 0;
-  int offset = 0;
-
-  switch (GET_CODE (addr))
-    {
-    case REG :
-      fputs (reg_names[REGNO (addr)], file);
-      break;
-    case SYMBOL_REF :
-      if (/*???*/ 0 && SYMBOL_REF_FUNCTION_P (addr))
-       {
-         fprintf (file, "%%st(");
-         output_addr_const (file, addr);
-         fprintf (file, ")");
-       }
-      else
-       output_addr_const (file, addr);
-      break;
-    case PLUS :
-      if (GET_CODE (XEXP (addr, 0)) == CONST_INT)
-       offset = INTVAL (XEXP (addr, 0)), base = XEXP (addr, 1);
-      else if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
-       offset = INTVAL (XEXP (addr, 1)), base = XEXP (addr, 0);
-      else
-       base = XEXP (addr, 0), index = XEXP (addr, 1);
-      gcc_assert (GET_CODE (base) == REG);
-      fputs (reg_names[REGNO (base)], file);
-      if (index == 0)
-       {
-         if (offset != 0)
-           fprintf (file, ",%d", offset);
-       }
-      else
-       {
-         switch (GET_CODE (index))
-           {
-           case REG:
-             fprintf (file, ",%s", reg_names[REGNO (index)]);
-             break;
-           case SYMBOL_REF:
-             fputc (',', file), output_addr_const (file, index);
-             break;
-           default:
-             gcc_unreachable ();
-           }
-       }
-      break;
-    case PRE_INC :
-    case PRE_DEC :
-      /* We shouldn't get here as we've lost the mode of the memory object
-        (which says how much to inc/dec by.  */
-      gcc_unreachable ();
-      break;
-    default :
-      output_addr_const (file, addr);
-      break;
-    }
-}
-
-/* Update compare/branch separation marker.  */
-
-static void
-record_cc_ref (rtx insn)
-{
-  last_insn_set_cc_p = current_insn_set_cc_p;
-
-  switch (get_attr_cond (insn))
-    {
-    case COND_SET :
-    case COND_SET_ZN :
-    case COND_SET_ZNC :
-      if (get_attr_length (insn) == 1)
-       current_insn_set_cc_p = 1;
-      else
-       current_insn_set_cc_p = 0;
-      break;
-    default :
-      current_insn_set_cc_p = 0;
-      break;
-    }
-}
-\f
-/* Conditional execution support.
-
-   This is based on the ARM port but for now is much simpler.
-
-   A finite state machine takes care of noticing whether or not instructions
-   can be conditionally executed, and thus decrease execution time and code
-   size by deleting branch instructions.  The fsm is controlled by
-   final_prescan_insn, and controls the actions of PRINT_OPERAND.  The patterns
-   in the .md file for the branch insns also have a hand in this.  */
-
-/* The state of the fsm controlling condition codes are:
-   0: normal, do nothing special
-   1: don't output this insn
-   2: don't output this insn
-   3: make insns conditional
-   4: make insns conditional
-
-   State transitions (state->state by whom, under what condition):
-   0 -> 1 final_prescan_insn, if insn is conditional branch
-   0 -> 2 final_prescan_insn, if the `target' is an unconditional branch
-   1 -> 3 branch patterns, after having not output the conditional branch
-   2 -> 4 branch patterns, after having not output the conditional branch
-   3 -> 0 (*targetm.asm_out.internal_label), if the `target' label is reached
-          (the target label has CODE_LABEL_NUMBER equal to
-         arc_ccfsm_target_label).
-   4 -> 0 final_prescan_insn, if `target' unconditional branch is reached
-
-   If the jump clobbers the conditions then we use states 2 and 4.
-
-   A similar thing can be done with conditional return insns.
-
-   We also handle separating branches from sets of the condition code.
-   This is done here because knowledge of the ccfsm state is required,
-   we may not be outputting the branch.  */
-
-void
-arc_final_prescan_insn (rtx insn,
-                        rtx *opvec ATTRIBUTE_UNUSED,
-                        int noperands ATTRIBUTE_UNUSED)
-{
-  /* BODY will hold the body of INSN.  */
-  register rtx body = PATTERN (insn);
-
-  /* This will be 1 if trying to repeat the trick (i.e.: do the `else' part of
-     an if/then/else), and things need to be reversed.  */
-  int reverse = 0;
-
-  /* If we start with a return insn, we only succeed if we find another one.  */
-  int seeking_return = 0;
-  
-  /* START_INSN will hold the insn from where we start looking.  This is the
-     first insn after the following code_label if REVERSE is true.  */
-  rtx start_insn = insn;
-
-  /* Update compare/branch separation marker.  */
-  record_cc_ref (insn);
-
-  /* Allow -mdebug-ccfsm to turn this off so we can see how well it does.
-     We can't do this in macro FINAL_PRESCAN_INSN because its called from
-     final_scan_insn which has `optimize' as a local.  */
-  if (optimize < 2 || TARGET_NO_COND_EXEC)
-    return;
-
-  /* If in state 4, check if the target branch is reached, in order to
-     change back to state 0.  */
-  if (arc_ccfsm_state == 4)
-    {
-      if (insn == arc_ccfsm_target_insn)
-       {
-         arc_ccfsm_target_insn = NULL;
-         arc_ccfsm_state = 0;
-       }
-      return;
-    }
-
-  /* If in state 3, it is possible to repeat the trick, if this insn is an
-     unconditional branch to a label, and immediately following this branch
-     is the previous target label which is only used once, and the label this
-     branch jumps to is not too far off.  Or in other words "we've done the
-     `then' part, see if we can do the `else' part."  */
-  if (arc_ccfsm_state == 3)
-    {
-      if (simplejump_p (insn))
-       {
-         start_insn = next_nonnote_insn (start_insn);
-         if (GET_CODE (start_insn) == BARRIER)
-           {
-             /* ??? Isn't this always a barrier?  */
-             start_insn = next_nonnote_insn (start_insn);
-           }
-         if (GET_CODE (start_insn) == CODE_LABEL
-             && CODE_LABEL_NUMBER (start_insn) == arc_ccfsm_target_label
-             && LABEL_NUSES (start_insn) == 1)
-           reverse = TRUE;
-         else
-           return;
-       }
-      else if (GET_CODE (body) == RETURN)
-        {
-         start_insn = next_nonnote_insn (start_insn);
-         if (GET_CODE (start_insn) == BARRIER)
-           start_insn = next_nonnote_insn (start_insn);
-         if (GET_CODE (start_insn) == CODE_LABEL
-             && CODE_LABEL_NUMBER (start_insn) == arc_ccfsm_target_label
-             && LABEL_NUSES (start_insn) == 1)
-           {
-             reverse = TRUE;
-             seeking_return = 1;
-           }
-         else
-           return;
-        }
-      else
-       return;
-    }
-
-  if (GET_CODE (insn) != JUMP_INSN)
-    return;
-
-  /* This jump might be paralleled with a clobber of the condition codes,
-     the jump should always come first.  */
-  if (GET_CODE (body) == PARALLEL && XVECLEN (body, 0) > 0)
-    body = XVECEXP (body, 0, 0);
-
-  if (reverse
-      || (GET_CODE (body) == SET && GET_CODE (SET_DEST (body)) == PC
-         && GET_CODE (SET_SRC (body)) == IF_THEN_ELSE))
-    {
-      int insns_skipped = 0, fail = FALSE, succeed = FALSE;
-      /* Flag which part of the IF_THEN_ELSE is the LABEL_REF.  */
-      int then_not_else = TRUE;
-      /* Nonzero if next insn must be the target label.  */
-      int next_must_be_target_label_p;
-      rtx this_insn = start_insn, label = 0;
-
-      /* Register the insn jumped to.  */
-      if (reverse)
-        {
-         if (!seeking_return)
-           label = XEXP (SET_SRC (body), 0);
-        }
-      else if (GET_CODE (XEXP (SET_SRC (body), 1)) == LABEL_REF)
-       label = XEXP (XEXP (SET_SRC (body), 1), 0);
-      else if (GET_CODE (XEXP (SET_SRC (body), 2)) == LABEL_REF)
-       {
-         label = XEXP (XEXP (SET_SRC (body), 2), 0);
-         then_not_else = FALSE;
-       }
-      else if (GET_CODE (XEXP (SET_SRC (body), 1)) == RETURN)
-       seeking_return = 1;
-      else if (GET_CODE (XEXP (SET_SRC (body), 2)) == RETURN)
-        {
-         seeking_return = 1;
-         then_not_else = FALSE;
-        }
-      else
-       gcc_unreachable ();
-
-      /* See how many insns this branch skips, and what kind of insns.  If all
-        insns are okay, and the label or unconditional branch to the same
-        label is not too far away, succeed.  */
-      for (insns_skipped = 0, next_must_be_target_label_p = FALSE;
-          !fail && !succeed && insns_skipped < MAX_INSNS_SKIPPED;
-          insns_skipped++)
-       {
-         rtx scanbody;
-
-         this_insn = next_nonnote_insn (this_insn);
-         if (!this_insn)
-           break;
-
-         if (next_must_be_target_label_p)
-           {
-             if (GET_CODE (this_insn) == BARRIER)
-               continue;
-             if (GET_CODE (this_insn) == CODE_LABEL
-                 && this_insn == label)
-               {
-                 arc_ccfsm_state = 1;
-                 succeed = TRUE;
-               }
-             else
-               fail = TRUE;
-             break;
-           }
-
-         scanbody = PATTERN (this_insn);
-
-         switch (GET_CODE (this_insn))
-           {
-           case CODE_LABEL:
-             /* Succeed if it is the target label, otherwise fail since
-                control falls in from somewhere else.  */
-             if (this_insn == label)
-               {
-                 arc_ccfsm_state = 1;
-                 succeed = TRUE;
-               }
-             else
-               fail = TRUE;
-             break;
-
-           case BARRIER:
-             /* Succeed if the following insn is the target label.
-                Otherwise fail.  
-                If return insns are used then the last insn in a function 
-                will be a barrier.  */
-             next_must_be_target_label_p = TRUE;
-             break;
-
-           case CALL_INSN:
-             /* Can handle a call insn if there are no insns after it.
-                IE: The next "insn" is the target label.  We don't have to
-                worry about delay slots as such insns are SEQUENCE's inside
-                INSN's.  ??? It is possible to handle such insns though.  */
-             if (get_attr_cond (this_insn) == COND_CANUSE)
-               next_must_be_target_label_p = TRUE;
-             else
-               fail = TRUE;
-             break;
-
-           case JUMP_INSN:
-             /* If this is an unconditional branch to the same label, succeed.
-                If it is to another label, do nothing.  If it is conditional,
-                fail.  */
-             /* ??? Probably, the test for the SET and the PC are unnecessary.  */
-
-             if (GET_CODE (scanbody) == SET
-                 && GET_CODE (SET_DEST (scanbody)) == PC)
-               {
-                 if (GET_CODE (SET_SRC (scanbody)) == LABEL_REF
-                     && XEXP (SET_SRC (scanbody), 0) == label && !reverse)
-                   {
-                     arc_ccfsm_state = 2;
-                     succeed = TRUE;
-                   }
-                 else if (GET_CODE (SET_SRC (scanbody)) == IF_THEN_ELSE)
-                   fail = TRUE;
-               }
-             else if (GET_CODE (scanbody) == RETURN
-                      && seeking_return)
-               {
-                 arc_ccfsm_state = 2;
-                 succeed = TRUE;
-               }
-             else if (GET_CODE (scanbody) == PARALLEL)
-               {
-                 if (get_attr_cond (this_insn) != COND_CANUSE)
-                   fail = TRUE;
-               }
-             break;
-
-           case INSN:
-             /* We can only do this with insns that can use the condition
-                codes (and don't set them).  */
-             if (GET_CODE (scanbody) == SET
-                 || GET_CODE (scanbody) == PARALLEL)
-               {
-                 if (get_attr_cond (this_insn) != COND_CANUSE)
-                   fail = TRUE;
-               }
-             /* We can't handle other insns like sequences.  */
-             else
-               fail = TRUE;
-             break;
-
-           default:
-             break;
-           }
-       }
-
-      if (succeed)
-       {
-         if ((!seeking_return) && (arc_ccfsm_state == 1 || reverse))
-           arc_ccfsm_target_label = CODE_LABEL_NUMBER (label);
-         else
-           {
-             gcc_assert (seeking_return || arc_ccfsm_state == 2);
-             while (this_insn && GET_CODE (PATTERN (this_insn)) == USE)
-               {
-                 this_insn = next_nonnote_insn (this_insn);
-                 gcc_assert (!this_insn
-                             || (GET_CODE (this_insn) != BARRIER
-                                 && GET_CODE (this_insn) != CODE_LABEL));
-               }
-             if (!this_insn)
-               {
-                 /* Oh dear! we ran off the end, give up.  */
-                 extract_insn_cached (insn);
-                 arc_ccfsm_state = 0;
-                 arc_ccfsm_target_insn = NULL;
-                 return;
-               }
-             arc_ccfsm_target_insn = this_insn;
-           }
-
-         /* If REVERSE is true, ARM_CURRENT_CC needs to be inverted from
-            what it was.  */
-         if (!reverse)
-           arc_ccfsm_current_cc = get_arc_condition_code (XEXP (SET_SRC (body),
-                                                                0));
-
-         if (reverse || then_not_else)
-           arc_ccfsm_current_cc = ARC_INVERSE_CONDITION_CODE (arc_ccfsm_current_cc);
-       }
-
-      /* Restore recog_data.  Getting the attributes of other insns can
-        destroy this array, but final.c assumes that it remains intact
-        across this call.  */
-      extract_insn_cached (insn);
-    }
-}
-
-/* Record that we are currently outputting label NUM with prefix PREFIX.
-   It it's the label we're looking for, reset the ccfsm machinery.
-
-   Called from (*targetm.asm_out.internal_label).  */
-
-void
-arc_ccfsm_at_label (const char *prefix, int num)
-{
-  if (arc_ccfsm_state == 3 && arc_ccfsm_target_label == num
-      && !strcmp (prefix, "L"))
-    {
-      arc_ccfsm_state = 0;
-      arc_ccfsm_target_insn = NULL_RTX;
-    }
-}
-
-/* See if the current insn, which is a conditional branch, is to be
-   deleted.  */
-
-int
-arc_ccfsm_branch_deleted_p (void)
-{
-  if (arc_ccfsm_state == 1 || arc_ccfsm_state == 2)
-    return 1;
-  return 0;
-}
-
-/* Record a branch isn't output because subsequent insns can be
-   conditionalized.  */
-
-void
-arc_ccfsm_record_branch_deleted (void)
-{
-  /* Indicate we're conditionalizing insns now.  */
-  arc_ccfsm_state += 2;
-
-  /* If the next insn is a subroutine call, we still need a nop between the
-     cc setter and user.  We need to undo the effect of calling record_cc_ref
-     for the just deleted branch.  */
-  current_insn_set_cc_p = last_insn_set_cc_p;
-}
-\f
-static void
-arc_va_start (tree valist, rtx nextarg)
-{
-  /* See arc_setup_incoming_varargs for reasons for this oddity.  */
-  if (crtl->args.info < 8
-      && (crtl->args.info & 1))
-    nextarg = plus_constant (nextarg, UNITS_PER_WORD);
-
-  std_expand_builtin_va_start (valist, nextarg);
-}
-
-/* This is how to output a definition of an internal numbered label where
-   PREFIX is the class of label and NUM is the number within the class.  */
-
-static void
-arc_internal_label (FILE *stream, const char *prefix, unsigned long labelno)
-{
-  arc_ccfsm_at_label (prefix, labelno);
-  default_internal_label (stream, prefix, labelno);
-}
-
-/* Worker function for TARGET_ASM_EXTERNAL_LIBCALL.  */
-
-static void
-arc_external_libcall (rtx fun ATTRIBUTE_UNUSED)
-{
-#if 0
-/* On the ARC we want to have libgcc's for multiple cpus in one binary.
-   We can't use `assemble_name' here as that will call ASM_OUTPUT_LABELREF
-   and we'll get another suffix added on if -mmangle-cpu.  */
-  if (TARGET_MANGLE_CPU_LIBGCC)
-    {
-      fprintf (FILE, "\t.rename\t_%s, _%s%s\n",
-              XSTR (SYMREF, 0), XSTR (SYMREF, 0),
-              arc_mangle_suffix);
-    }
-#endif
-}
-
-/* Worker function for TARGET_RETURN_IN_MEMORY.  */
-
-static bool
-arc_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
-{
-  if (AGGREGATE_TYPE_P (type))
-    return true;
-  else
-    {
-      HOST_WIDE_INT size = int_size_in_bytes (type);
-      return (size == -1 || size > 8);
-    }
-}
-
-/* For ARC, All aggregates and arguments greater than 8 bytes are
-   passed by reference.  */
-
-static bool
-arc_pass_by_reference (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,
-                      enum machine_mode mode, const_tree type,
-                      bool named ATTRIBUTE_UNUSED)
-{
-  unsigned HOST_WIDE_INT size;
-
-  if (type)
-    {
-      if (AGGREGATE_TYPE_P (type))
-       return true;
-      size = int_size_in_bytes (type);
-    }
-  else
-    size = GET_MODE_SIZE (mode);
-
-  return size > 8;
-}
-
-/* Round SIZE up to a word boundary.  */
-#define ROUND_ADVANCE(SIZE) \
-(((SIZE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
-
-/* Round arg MODE/TYPE up to the next word boundary.  */
-#define ROUND_ADVANCE_ARG(MODE, TYPE) \
-((MODE) == BLKmode                             \
- ? ROUND_ADVANCE (int_size_in_bytes (TYPE))    \
- : ROUND_ADVANCE (GET_MODE_SIZE (MODE)))
-
-/* Round CUM up to the necessary point for argument MODE/TYPE.  */
-#define ROUND_ADVANCE_CUM(CUM, MODE, TYPE) \
-((((MODE) == BLKmode ? TYPE_ALIGN (TYPE) : GET_MODE_BITSIZE (MODE)) \
-  > BITS_PER_WORD)     \
- ? (((CUM) + 1) & ~1)  \
- : (CUM))
-
-/* Return boolean indicating arg of type TYPE and mode MODE will be passed in
-   a reg.  This includes arguments that have to be passed by reference as the
-   pointer to them is passed in a reg if one is available (and that is what
-   we're given).  */
-#define PASS_IN_REG_P(CUM, MODE, TYPE) \
-((CUM) < MAX_ARC_PARM_REGS                                             \
- && ((ROUND_ADVANCE_CUM ((CUM), (MODE), (TYPE))                                \
-      + ROUND_ADVANCE_ARG ((MODE), (TYPE))                             \
-      <= MAX_ARC_PARM_REGS)))
-
-/* Determine where to put an argument to a function.
-   Value is zero to push the argument on the stack,
-   or a hard register in which to store the argument.
-
-   MODE is the argument's machine mode.
-   TYPE is the data type of the argument (as a tree).
-    This is null for libcalls where that information may
-    not be available.
-   CUM is a variable of type CUMULATIVE_ARGS which gives info about
-    the preceding args and about the function being called.
-   NAMED is nonzero if this argument is a named parameter
-    (otherwise it is an extra parameter matching an ellipsis).  */
-/* On the ARC the first MAX_ARC_PARM_REGS args are normally in registers
-   and the rest are pushed.  */
-
-static rtx
-arc_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
-                 const_tree type, bool named ATTRIBUTE_UNUSED)
-{
-  return (PASS_IN_REG_P (*cum, mode, type)
-         ? gen_rtx_REG (mode, ROUND_ADVANCE_CUM (*cum, mode, type))
-         : NULL_RTX);
-}
-
-/* Worker function for TARGET_FUNCTION_ARG_ADVANCE.  */
-
-static void
-arc_function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
-                         const_tree type, bool named ATTRIBUTE_UNUSED)
-{
-  *cum = (ROUND_ADVANCE_CUM (*cum, mode, type)
-         + ROUND_ADVANCE_ARG (mode, type));
-}
-
-/* Worker function for TARGET_FUNCTION_ARG_BOUNDARY.  */
-
-static unsigned int
-arc_function_arg_boundary (enum machine_mode mode, const_tree type)
-{
-  return (type != NULL_TREE
-         ? TYPE_ALIGN (type)
-         : (GET_MODE_BITSIZE (mode) <= PARM_BOUNDARY
-            ? PARM_BOUNDARY
-            : 2 * PARM_BOUNDARY));
-}
-
-/* Trampolines.  */
-/* ??? This doesn't work yet because GCC will use as the address of a nested
-   function the address of the trampoline.  We need to use that address
-   right shifted by 2.  It looks like we'll need PSImode after all. :-( 
-
-   ??? The above comment sounds like it's doable via
-   TARGET_TRAMPOLINE_ADJUST_ADDRESS; no PSImode needed.
-
-   On the ARC, the trampoline is quite simple as we have 32-bit immediate
-   constants.
-
-       mov r24,STATIC
-       j.nd FUNCTION
-*/
-
-static void
-arc_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
-{
-  rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
-  rtx mem;
-
-  mem = adjust_address (m_tramp, SImode, 0);
-  emit_move_insn (mem, GEN_INT (0x631f7c00));
-
-  mem = adjust_address (m_tramp, SImode, 4);
-  emit_move_insn (mem, chain_value);
-
-  mem = adjust_address (m_tramp, SImode, 8);
-  emit_move_insn (mem, GEN_INT (0x381f0000));
-
-  mem = adjust_address (m_tramp, SImode, 12);
-  emit_move_insn (mem, fnaddr);
-
-  emit_insn (gen_flush_icache (m_tramp));
-}
-
-/* Worker function for TARGET_CONDITIONAL_REGISTER_USAGE.  */
-
-static void
-arc_conditional_register_usage (void)
-{
-  if (PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
-    {
-      fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1;
-      call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1;
-    }
-}
-
diff --git a/gcc/config/arc/arc.h b/gcc/config/arc/arc.h
deleted file mode 100644 (file)
index 0f2b99c..0000000
+++ /dev/null
@@ -1,935 +0,0 @@
-/* Definitions of target machine for GNU compiler, Argonaut ARC cpu.
-   Copyright (C) 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005,
-   2007, 2008, 2009, 2010 Free Software Foundation, 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 3, 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 COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* ??? This is an old port, and is undoubtedly suffering from bit rot.  */
-
-/* Things to do:
-
-   - incscc, decscc?
-   - print active compiler options in assembler output
-*/
-
-
-#undef ASM_SPEC
-#undef LINK_SPEC
-#undef LIB_SPEC
-#undef STARTFILE_SPEC
-#undef ENDFILE_SPEC
-#undef SIZE_TYPE
-#undef PTRDIFF_TYPE
-#undef WCHAR_TYPE
-#undef WCHAR_TYPE_SIZE
-#undef ASM_OUTPUT_LABELREF
-\f
-/* Print subsidiary information on the compiler version in use.  */
-#define TARGET_VERSION fprintf (stderr, " (arc)")
-
-/* Names to predefine in the preprocessor for this target machine.  */
-#define TARGET_CPU_CPP_BUILTINS()              \
-  do                                           \
-    {                                          \
-       builtin_define ("__arc__");             \
-       if (TARGET_BIG_ENDIAN)                  \
-         builtin_define ("__big_endian__");    \
-       if (arc_cpu_type == 0)                  \
-         builtin_define ("__base__");          \
-       builtin_assert ("cpu=arc");             \
-       builtin_assert ("machine=arc");         \
-    } while (0)
-
-/* Pass -mmangle-cpu if we get -mcpu=*.
-   Doing it this way lets one have it on as default with -mcpu=*,
-   but also lets one turn it off with -mno-mangle-cpu.  */
-#define CC1_SPEC "\
-%{mcpu=*:-mmangle-cpu} \
-%{EB:%{EL:%emay not use both -EB and -EL}} \
-%{EB:-mbig-endian} %{EL:-mlittle-endian} \
-"
-
-#define ASM_SPEC "%{EB} %{EL}"
-
-#define LINK_SPEC "%{v} %{EB} %{EL}"
-
-#define LIB_SPEC "-lc"
-
-#define STARTFILE_SPEC "%{!shared:crt0.o%s} crtinit.o%s"
-
-#define ENDFILE_SPEC "crtfini.o%s"
-\f
-/* Instruction set characteristics.
-   These are internal macros, set by the appropriate -mcpu= option.  */
-
-/* Nonzero means the cpu has a barrel shifter.  */
-#define TARGET_SHIFTER 0
-
-/* Which cpu we're compiling for.  */
-extern int arc_cpu_type;
-
-/* Check if CPU is an extension and set `arc_cpu_type' and `arc_mangle_cpu'
-   appropriately.  The result should be nonzero if the cpu is recognized,
-   otherwise zero.  This is intended to be redefined in a cover file.
-   This is used by arc_handle_option.  */
-#define ARC_EXTENSION_CPU(cpu) 0
-
-\f
-/* Target machine storage layout.  */
-
-/* Define this if most significant bit is lowest numbered
-   in instructions that operate on numbered bit-fields.  */
-#define BITS_BIG_ENDIAN 1
-
-/* Define this if most significant byte of a word is the lowest numbered.  */
-#define BYTES_BIG_ENDIAN (TARGET_BIG_ENDIAN)
-
-/* Define this if most significant word of a multiword number is the lowest
-   numbered.  */
-#define WORDS_BIG_ENDIAN (TARGET_BIG_ENDIAN)
-
-/* Width of a word, in units (bytes).  */
-#define UNITS_PER_WORD 4
-
-/* Define this macro if it is advisable to hold scalars in registers
-   in a wider mode than that declared by the program.  In such cases, 
-   the value is constrained to be within the bounds of the declared
-   type, but kept valid in the wider mode.  The signedness of the
-   extension may differ from that of the type.  */
-#define PROMOTE_MODE(MODE,UNSIGNEDP,TYPE) \
-if (GET_MODE_CLASS (MODE) == MODE_INT          \
-    && GET_MODE_SIZE (MODE) < UNITS_PER_WORD)  \
-{                                              \
-  (MODE) = SImode;                             \
-}
-
-/* Allocation boundary (in *bits*) for storing arguments in argument list.  */
-#define PARM_BOUNDARY 32
-
-/* Boundary (in *bits*) on which stack pointer should be aligned.  */
-#define STACK_BOUNDARY 64
-
-/* ALIGN FRAMES on word boundaries */
-#define ARC_STACK_ALIGN(LOC) (((LOC)+7) & ~7)
-
-/* Allocation boundary (in *bits*) for the code of a function.  */
-#define FUNCTION_BOUNDARY 32
-
-/* Alignment of field after `int : 0' in a structure.  */
-#define EMPTY_FIELD_BOUNDARY 32
-
-/* Every structure's size must be a multiple of this.  */
-#define STRUCTURE_SIZE_BOUNDARY 8
-
-/* A bit-field declared as `int' forces `int' alignment for the struct.  */
-#define PCC_BITFIELD_TYPE_MATTERS 1
-
-/* No data type wants to be aligned rounder than this.  */
-/* This is bigger than currently necessary for the ARC.  If 8 byte floats are
-   ever added it's not clear whether they'll need such alignment or not.  For
-   now we assume they will.  We can always relax it if necessary but the
-   reverse isn't true.  */
-#define BIGGEST_ALIGNMENT 64
-
-/* The best alignment to use in cases where we have a choice.  */
-#define FASTEST_ALIGNMENT 32
-
-/* Make strings word-aligned so strcpy from constants will be faster.  */
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \
-  ((TREE_CODE (EXP) == STRING_CST      \
-    && (ALIGN) < FASTEST_ALIGNMENT)    \
-   ? FASTEST_ALIGNMENT : (ALIGN))
-
-/* Make arrays of chars word-aligned for the same reasons.  */
-#define DATA_ALIGNMENT(TYPE, ALIGN)            \
-  (TREE_CODE (TYPE) == ARRAY_TYPE              \
-   && TYPE_MODE (TREE_TYPE (TYPE)) == QImode   \
-   && (ALIGN) < FASTEST_ALIGNMENT ? FASTEST_ALIGNMENT : (ALIGN))
-
-/* Set this nonzero if move instructions will actually fail to work
-   when given unaligned data.  */
-/* On the ARC the lower address bits are masked to 0 as necessary.  The chip
-   won't croak when given an unaligned address, but the insn will still fail
-   to produce the correct result.  */
-#define STRICT_ALIGNMENT 1
-\f
-/* Layout of source language data types.  */
-
-#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
-
-/* Define this as 1 if `char' should by default be signed; else as 0.  */
-#define DEFAULT_SIGNED_CHAR 1
-
-#define SIZE_TYPE "long unsigned int"
-#define PTRDIFF_TYPE "long int"
-#define WCHAR_TYPE "short unsigned int"
-#define WCHAR_TYPE_SIZE 16
-\f
-/* Standard register usage.  */
-
-/* Number of actual hardware registers.
-   The hardware registers are assigned numbers for the compiler
-   from 0 to just below FIRST_PSEUDO_REGISTER.
-   All registers that the compiler knows about must be given numbers,
-   even those that are not normally considered general registers.  */
-/* Registers 61, 62, and 63 are not really registers and we needn't treat
-   them as such.  We still need a register for the condition code.  */
-#define FIRST_PSEUDO_REGISTER 62
-
-/* 1 for registers that have pervasive standard uses
-   and are not available for the register allocator.
-
-   0-28  - general purpose registers
-   29    - ilink1 (interrupt link register)
-   30    - ilink2 (interrupt link register)
-   31    - blink (branch link register)
-   32-59 - reserved for extensions
-   60    - LP_COUNT
-   61    - condition code
-
-   For doc purposes:
-   61    - short immediate data indicator (setting flags)
-   62    - long immediate data indicator
-   63    - short immediate data indicator (not setting flags).
-
-   The general purpose registers are further broken down into:
-   0-7   - arguments/results
-   8-15  - call used
-   16-23 - call saved
-   24    - call used, static chain pointer
-   25    - call used, gptmp
-   26    - global pointer
-   27    - frame pointer
-   28    - stack pointer
-
-   By default, the extension registers are not available.  */
-
-#define FIXED_REGISTERS \
-{ 0, 0, 0, 0, 0, 0, 0, 0,      \
-  0, 0, 0, 0, 0, 0, 0, 0,      \
-  0, 0, 0, 0, 0, 0, 0, 0,      \
-  0, 0, 0, 1, 1, 1, 1, 0,      \
-                               \
-  1, 1, 1, 1, 1, 1, 1, 1,      \
-  1, 1, 1, 1, 1, 1, 1, 1,      \
-  1, 1, 1, 1, 1, 1, 1, 1,      \
-  1, 1, 1, 1, 1, 1 }
-
-/* 1 for registers not available across function calls.
-   These must include the FIXED_REGISTERS and also any
-   registers that can be used without being saved.
-   The latter must include the registers where values are returned
-   and the register where structure-value addresses are passed.
-   Aside from that, you can include as many other registers as you like.  */
-
-#define CALL_USED_REGISTERS \
-{ 1, 1, 1, 1, 1, 1, 1, 1,      \
-  1, 1, 1, 1, 1, 1, 1, 1,      \
-  0, 0, 0, 0, 0, 0, 0, 0,      \
-  1, 1, 1, 1, 1, 1, 1, 1,      \
-                               \
-  1, 1, 1, 1, 1, 1, 1, 1,      \
-  1, 1, 1, 1, 1, 1, 1, 1,      \
-  1, 1, 1, 1, 1, 1, 1, 1,      \
-  1, 1, 1, 1, 1, 1 }
-
-/* 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).  */
-#define REG_ALLOC_ORDER \
-{ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1,                        \
-  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 31,                      \
-  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,      \
-  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,              \
-  27, 28, 29, 30 }
-
-/* Return number of consecutive hard regs needed starting at reg REGNO
-   to hold something of mode MODE.
-   This is ordinarily the length in words of a value of mode MODE
-   but can be less for certain modes in special long registers.  */
-#define HARD_REGNO_NREGS(REGNO, MODE) \
-((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
-
-/* Value is 1 if hard register REGNO can hold a value of machine-mode MODE.  */
-extern const unsigned int arc_hard_regno_mode_ok[];
-extern unsigned int arc_mode_class[];
-#define HARD_REGNO_MODE_OK(REGNO, MODE) \
-((arc_hard_regno_mode_ok[REGNO] & arc_mode_class[MODE]) != 0)
-
-/* 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.  */
-
-/* Tie QI/HI/SI modes together.  */
-#define MODES_TIEABLE_P(MODE1, MODE2) \
-(GET_MODE_CLASS (MODE1) == MODE_INT            \
- && GET_MODE_CLASS (MODE2) == MODE_INT         \
- && GET_MODE_SIZE (MODE1) <= UNITS_PER_WORD    \
- && GET_MODE_SIZE (MODE2) <= UNITS_PER_WORD)
-\f
-/* Register classes and constants.  */
-
-/* Define the classes of registers for register constraints in the
-   machine description.  Also define ranges of constants.
-
-   One of the classes must always be named ALL_REGS and include all hard regs.
-   If there is more than one class, another class must be named NO_REGS
-   and contain no registers.
-
-   The name GENERAL_REGS must be the name of a class (or an alias for
-   another name such as ALL_REGS).  This is the class of registers
-   that is allowed by "g" or "r" in a register constraint.
-   Also, registers outside this class are allocated only when
-   instructions express preferences for them.
-
-   The classes must be numbered in nondecreasing order; that is,
-   a larger-numbered class must never be contained completely
-   in a smaller-numbered class.
-
-   For any two classes, it is very desirable that there be another
-   class that represents their union.
-
-   It is important that any condition codes have class NO_REGS.
-   See `register_operand'.  */
-
-enum reg_class {
-  NO_REGS, LPCOUNT_REG, GENERAL_REGS, ALL_REGS, LIM_REG_CLASSES
-};
-
-#define N_REG_CLASSES (int) LIM_REG_CLASSES
-
-/* Give names of register classes as strings for dump file.  */
-#define REG_CLASS_NAMES \
-{ "NO_REGS", "LPCOUNT_REG", "GENERAL_REGS", "ALL_REGS" }
-
-/* Define which registers fit in which classes.
-   This is an initializer for a vector of HARD_REG_SET
-   of length N_REG_CLASSES.  */
-
-#define REG_CLASS_CONTENTS \
-{ {0, 0}, {0, 0x10000000}, {0xffffffff, 0xfffffff}, \
-  {0xffffffff, 0x1fffffff} }
-
-/* The same information, inverted:
-   Return the class number of the smallest class containing
-   reg number REGNO.  This could be a conditional expression
-   or could index an array.  */
-extern enum reg_class arc_regno_reg_class[FIRST_PSEUDO_REGISTER];
-#define REGNO_REG_CLASS(REGNO) \
-(arc_regno_reg_class[REGNO])
-
-/* The class value for index registers, and the one for base regs.  */
-#define INDEX_REG_CLASS GENERAL_REGS
-#define BASE_REG_CLASS GENERAL_REGS
-
-/* Get reg_class from a letter such as appears in the machine description.  */
-#define REG_CLASS_FROM_LETTER(C) \
-((C) == 'l' ? LPCOUNT_REG /* ??? needed? */ \
- : NO_REGS)
-
-/* These assume that REGNO is a hard or pseudo reg number.
-   They give nonzero only if REGNO is a hard reg of the suitable class
-   or a pseudo reg currently allocated to a suitable hard reg.
-   Since they use reg_renumber, they are safe only once reg_renumber
-   has been allocated, which happens in local-alloc.c.  */
-#define REGNO_OK_FOR_BASE_P(REGNO) \
-((REGNO) < 32 || (unsigned) reg_renumber[REGNO] < 32)
-#define REGNO_OK_FOR_INDEX_P(REGNO) \
-((REGNO) < 32 || (unsigned) reg_renumber[REGNO] < 32)
-
-/* Return the maximum number of consecutive registers
-   needed to represent mode MODE in a register of class CLASS.  */
-#define CLASS_MAX_NREGS(CLASS, MODE) \
-((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
-
-/* The letters I, J, K, L, M, N, O, P in a register constraint string
-   can be used to stand for particular ranges of immediate operands.
-   This macro defines what the ranges are.
-   C is the letter, and VALUE is a constant value.
-   Return 1 if VALUE is in the range specified by C.  */
-/* 'I' is used for short immediates (always signed).
-   'J' is used for long immediates.
-   'K' is used for any constant up to 64 bits (for 64x32 situations?).  */
-
-/* local to this file */
-#define SMALL_INT(X) ((unsigned) ((X) + 0x100) < 0x200)
-/* local to this file */
-#define LARGE_INT(X) \
-((X) >= (-(HOST_WIDE_INT) 0x7fffffff - 1) \
- && (unsigned HOST_WIDE_INT)(X) <= (unsigned HOST_WIDE_INT) 0xffffffff)
-
-#define CONST_OK_FOR_LETTER_P(VALUE, C) \
-((C) == 'I' ? SMALL_INT (VALUE)                \
- : (C) == 'J' ? LARGE_INT (VALUE)      \
- : (C) == 'K' ? 1                      \
- : 0)
-
-/* Similar, but for floating constants, and defining letters G and H.
-   Here VALUE is the CONST_DOUBLE rtx itself.  */
-/* 'G' is used for integer values for the multiplication insns where the
-   operands are extended from 4 bytes to 8 bytes.
-   'H' is used when any 64-bit constant is allowed.  */
-#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \
-((C) == 'G' ? arc_double_limm_p (VALUE) \
- : (C) == 'H' ? 1 \
- : 0)
-
-/* A C expression that defines the optional machine-dependent constraint
-   letters that can be used to segregate specific types of operands,
-   usually memory references, for the 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.  */
-/* ??? This currently isn't used.  Waiting for PIC.  */
-#if 0
-#define EXTRA_CONSTRAINT(VALUE, C) \
-((C) == 'R' ? (SYMBOL_REF_FUNCTION_P (VALUE) || GET_CODE (VALUE) == LABEL_REF) \
- : 0)
-#endif
-\f
-/* Stack layout and stack pointer usage.  */
-
-/* Define this macro if pushing a word onto the stack moves the stack
-   pointer to a smaller address.  */
-#define STACK_GROWS_DOWNWARD
-
-/* Define this to nonzero if the nominal address of the stack frame
-   is at the high-address end of the local variables;
-   that is, each additional local variable allocated
-   goes at a more negative offset in the frame.  */
-#define FRAME_GROWS_DOWNWARD 1
-
-/* Offset within stack frame to start allocating local variables at.
-   If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
-   first local allocated.  Otherwise, it is the offset to the BEGINNING
-   of the first local allocated.  */
-#define STARTING_FRAME_OFFSET 0
-
-/* Offset from the stack pointer register to the first location at which
-   outgoing arguments are placed.  */
-#define STACK_POINTER_OFFSET FIRST_PARM_OFFSET (0)
-
-/* Offset of first parameter from the argument pointer register value.  */
-/* 4 bytes for each of previous fp, return address, and previous gp.
-   4 byte reserved area for future considerations.  */
-#define FIRST_PARM_OFFSET(FNDECL) 16
-
-/* 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.  */
-/* ??? unfinished */
-/*define 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.
-   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 current return address is in r31.  The return address of anything
-   farther back is at [%fp,4].  */
-#if 0 /* The default value should work.  */
-#define RETURN_ADDR_RTX(COUNT, FRAME) \
-(((COUNT) == -1)                                                       \
- ? gen_rtx_REG (Pmode, 31)                                             \
- : copy_to_reg (gen_rtx_MEM (Pmode,                                    \
-                            memory_address (Pmode,                     \
-                                            plus_constant ((FRAME),    \
-                                                           UNITS_PER_WORD)))))
-#endif
-
-/* Register to use for pushing function arguments.  */
-#define STACK_POINTER_REGNUM 28
-
-/* Base register for access to local variables of the function.  */
-#define FRAME_POINTER_REGNUM 27
-
-/* Base register for access to arguments of the function.  */
-#define ARG_POINTER_REGNUM FRAME_POINTER_REGNUM
-
-/* Register in which static-chain is passed to a function.  This must
-   not be a register used by the prologue.  */
-#define STATIC_CHAIN_REGNUM 24
-
-/* C statement to store the difference between the frame pointer
-   and the stack pointer values immediately after the function prologue.  */
-#define INITIAL_FRAME_POINTER_OFFSET(VAR) \
-((VAR) = arc_compute_frame_size (get_frame_size ()))
-\f
-/* Function argument passing.  */
-
-/* If defined, the maximum amount of space required for outgoing
-   arguments will be computed and placed into the variable
-   `crtl->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.  */
-#define ACCUMULATE_OUTGOING_ARGS 1
-
-/* Define a data type for recording info about an argument list
-   during the scan of that argument list.  This data type should
-   hold all necessary information about the function itself
-   and about the args processed so far, enough to enable macros
-   such as FUNCTION_ARG to determine where the next arg should go.  */
-#define CUMULATIVE_ARGS int
-
-/* Initialize a variable CUM of type CUMULATIVE_ARGS
-   for a call to a function whose data type is FNTYPE.
-   For a library call, FNTYPE is 0.  */
-#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \
-((CUM) = 0)
-
-/* The number of registers used for parameter passing.  Local to this file.  */
-#define MAX_ARC_PARM_REGS 8
-
-/* 1 if N is a possible register number for function argument passing.  */
-#define FUNCTION_ARG_REGNO_P(N) \
-((unsigned) (N) < MAX_ARC_PARM_REGS)
-
-\f
-/* Function results.  */
-
-/* Define how to find the value returned by a function.
-   VALTYPE is the data type of the value (as a tree).
-   If the precise function being called is known, FUNC is its FUNCTION_DECL;
-   otherwise, FUNC is 0.  */
-#define FUNCTION_VALUE(VALTYPE, FUNC) gen_rtx_REG (TYPE_MODE (VALTYPE), 0)
-
-/* Define how to find the value returned by a library function
-   assuming the value has mode MODE.  */
-#define LIBCALL_VALUE(MODE) gen_rtx_REG (MODE, 0)
-
-/* 1 if N is a possible register number for a function value
-   as seen by the caller.  */
-/* ??? What about r1 in DI/DF values.  */
-#define FUNCTION_VALUE_REGNO_P(N) ((N) == 0)
-
-/* Tell GCC to use TARGET_RETURN_IN_MEMORY.  */
-#define DEFAULT_PCC_STRUCT_RETURN 0
-\f
-/* EXIT_IGNORE_STACK should be nonzero if, when returning from a function,
-   the stack pointer does not matter.  The value is tested only in
-   functions that have frame pointers.
-   No definition is equivalent to always zero.  */
-#define EXIT_IGNORE_STACK 0
-
-/* Epilogue delay slots.  */
-#define DELAY_SLOTS_FOR_EPILOGUE arc_delay_slots_for_epilogue ()
-
-#define ELIGIBLE_FOR_EPILOGUE_DELAY(TRIAL, SLOTS_FILLED) \
-arc_eligible_for_epilogue_delay (TRIAL, SLOTS_FILLED)
-
-/* Output assembler code to FILE to increment profiler label # LABELNO
-   for profiling a function entry.  */
-#define FUNCTION_PROFILER(FILE, LABELNO)
-\f
-#define TRAMPOLINE_ALIGNMENT 32
-#define TRAMPOLINE_SIZE 16
-\f
-/* Addressing modes, and classification of registers for them.  */
-
-/* Maximum number of registers that can appear in a valid memory address.  */
-/* The `ld' insn allows 2, but the `st' insn only allows 1.  */
-#define MAX_REGS_PER_ADDRESS 1
-
-/* We have pre inc/dec (load/store with update).  */
-#define HAVE_PRE_INCREMENT 1
-#define HAVE_PRE_DECREMENT 1
-
-/* Recognize any constant value that is a valid address.  */
-#define CONSTANT_ADDRESS_P(X) \
-(GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF       \
- || GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST)
-
-/* Nonzero if the constant value X is a legitimate general operand.
-   We can handle any 32- or 64-bit constant.  */
-/* "1" should work since the largest constant should be a 64 bit critter.  */
-/* ??? Not sure what to do for 64x32 compiler.  */
-#define LEGITIMATE_CONSTANT_P(X) 1
-
-/* The macros REG_OK_FOR..._P assume that the arg is a REG rtx
-   and check its validity for a certain class.
-   We have two alternate definitions for each of them.
-   The usual definition accepts all pseudo regs; the other rejects
-   them unless they have been allocated suitable hard regs.
-   The symbol REG_OK_STRICT causes the latter definition to be used.
-
-   Most source files want to accept pseudo regs in the hope that
-   they will get allocated to the class that the insn wants them to be in.
-   Source files for reload pass need to be strict.
-   After reload, it makes no difference, since pseudo regs have
-   been eliminated by then.  */
-
-#ifndef REG_OK_STRICT
-
-/* Nonzero if X is a hard reg that can be used as an index
-   or if it is a pseudo reg.  */
-#define REG_OK_FOR_INDEX_P(X) \
-((unsigned) REGNO (X) - 32 >= FIRST_PSEUDO_REGISTER - 32)
-/* Nonzero if X is a hard reg that can be used as a base reg
-   or if it is a pseudo reg.  */
-#define REG_OK_FOR_BASE_P(X) \
-((unsigned) REGNO (X) - 32 >= FIRST_PSEUDO_REGISTER - 32)
-
-#else
-
-/* Nonzero if X is a hard reg that can be used as an index.  */
-#define REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P (REGNO (X))
-/* Nonzero if X is a hard reg that can be used as a base reg.  */
-#define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X))
-
-#endif
-
-/* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
-   that is a valid memory address for an instruction.
-   The MODE argument is the machine mode for the MEM expression
-   that wants to use this address.  */
-/* The `ld' insn allows [reg],[reg+shimm],[reg+limm],[reg+reg],[limm]
-   but the `st' insn only allows [reg],[reg+shimm],[limm].
-   The only thing we can do is only allow the most strict case `st' and hope
-   other parts optimize out the restrictions for `ld'.  */
-
-/* local to this file */
-#define RTX_OK_FOR_BASE_P(X) \
-(REG_P (X) && REG_OK_FOR_BASE_P (X))
-
-/* local to this file */
-#define RTX_OK_FOR_INDEX_P(X) \
-(0 && /*???*/ REG_P (X) && REG_OK_FOR_INDEX_P (X))
-
-/* local to this file */
-/* ??? Loads can handle any constant, stores can only handle small ones.  */
-#define RTX_OK_FOR_OFFSET_P(X) \
-(GET_CODE (X) == CONST_INT && SMALL_INT (INTVAL (X)))
-
-#define LEGITIMATE_OFFSET_ADDRESS_P(MODE, X) \
-(GET_CODE (X) == PLUS                          \
- && RTX_OK_FOR_BASE_P (XEXP (X, 0))            \
- && (RTX_OK_FOR_INDEX_P (XEXP (X, 1))          \
-     || RTX_OK_FOR_OFFSET_P (XEXP (X, 1))))
-
-#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR)                \
-{ if (RTX_OK_FOR_BASE_P (X))                           \
-    goto ADDR;                                         \
-  if (LEGITIMATE_OFFSET_ADDRESS_P ((MODE), (X)))       \
-    goto ADDR;                                         \
-  if (GET_CODE (X) == CONST_INT && LARGE_INT (INTVAL (X))) \
-    goto ADDR;                                         \
-  if (GET_CODE (X) == SYMBOL_REF                       \
-          || GET_CODE (X) == LABEL_REF                 \
-          || GET_CODE (X) == CONST)                    \
-    goto ADDR;                                         \
-  if ((GET_CODE (X) == PRE_DEC || GET_CODE (X) == PRE_INC) \
-      /* We're restricted here by the `st' insn.  */   \
-      && RTX_OK_FOR_BASE_P (XEXP ((X), 0)))            \
-    goto ADDR;                                         \
-}
-\f
-/* Given a comparison code (EQ, NE, etc.) and the first operand of a COMPARE,
-   return the mode to be used for the comparison.  */
-#define SELECT_CC_MODE(OP, X, Y) \
-arc_select_cc_mode (OP, X, Y)
-
-/* Return nonzero if SELECT_CC_MODE will never return MODE for a
-   floating point inequality comparison.  */
-#define REVERSIBLE_CC_MODE(MODE) 1 /*???*/
-\f
-/* Costs.  */
-
-/* Compute extra cost of moving data between one register class
-   and another.  */
-#define REGISTER_MOVE_COST(MODE, CLASS1, CLASS2) 2
-
-/* Compute the cost of moving data between registers and memory.  */
-/* Memory is 3 times as expensive as registers.
-   ??? Is that the right way to look at it?  */
-#define MEMORY_MOVE_COST(MODE,CLASS,IN) \
-(GET_MODE_SIZE (MODE) <= UNITS_PER_WORD ? 6 : 12)
-
-/* The cost of a branch insn.  */
-/* ??? What's the right value here?  Branches are certainly more
-   expensive than reg->reg moves.  */
-#define BRANCH_COST(speed_p, predictable_p) 2
-
-/* Nonzero if access to memory by bytes is slow and undesirable.
-   For RISC chips, it means that access to memory by bytes is no
-   better than access by words when possible, so grab a whole word
-   and maybe make use of that.  */
-#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.  */
-/* On the ARC, calling through registers is slow.  */
-#define NO_FUNCTION_CSE
-\f
-/* Section selection.  */
-/* WARNING: These section names also appear in dwarfout.c.  */
-
-/* The names of the text, data, and readonly-data sections are runtime
-   selectable.  */
-
-#define ARC_SECTION_FORMAT             "\t.section %s"
-#define ARC_DEFAULT_TEXT_SECTION       ".text"
-#define ARC_DEFAULT_DATA_SECTION       ".data"
-#define ARC_DEFAULT_RODATA_SECTION     ".rodata"
-
-extern const char *arc_text_section, *arc_data_section, *arc_rodata_section;
-
-/* initfini.c uses this in an asm.  */
-#if defined (CRT_INIT) || defined (CRT_FINI)
-#define TEXT_SECTION_ASM_OP    "\t.section .text"
-#else
-#define TEXT_SECTION_ASM_OP    arc_text_section
-#endif
-#define DATA_SECTION_ASM_OP    arc_data_section
-
-#undef  READONLY_DATA_SECTION_ASM_OP
-#define READONLY_DATA_SECTION_ASM_OP   arc_rodata_section
-
-#define BSS_SECTION_ASM_OP     "\t.section .bss"
-
-/* Define this macro if jump tables (for tablejump insns) should be
-   output in the text section, along with the assembler instructions.
-   Otherwise, the readonly data section is used.
-   This macro is irrelevant if there is no separate readonly data section.  */
-/*#define JUMP_TABLES_IN_TEXT_SECTION*/
-
-/* For DWARF.  Marginally different than default so output is "prettier"
-   (and consistent with above).  */
-#define PUSHSECTION_ASM_OP "\t.section "
-
-/* Tell crtstuff.c we're using ELF.  */
-#define OBJECT_FORMAT_ELF
-\f
-/* PIC */
-
-/* The register number of the register used to address a table of static
-   data addresses in memory.  In some cases this register is defined by a
-   processor's ``application binary interface'' (ABI).  When this macro
-   is defined, RTL is generated for this register once, as with the stack
-   pointer and frame pointer registers.  If this macro is not defined, it
-   is up to the machine-dependent files to allocate such a register (if
-   necessary).  */
-#define PIC_OFFSET_TABLE_REGNUM  (flag_pic ? 26 : INVALID_REGNUM)
-
-/* Define this macro if the register defined by PIC_OFFSET_TABLE_REGNUM is
-   clobbered by calls.  Do not define this macro if PIC_OFFSET_TABLE_REGNUM
-   is not defined.  */
-/* This register is call-saved on the ARC.  */
-/*#define PIC_OFFSET_TABLE_REG_CALL_CLOBBERED*/
-
-/* 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)*/
-\f
-/* Control the assembler format that we output.  */
-
-/* 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 ";"
-
-/* Output to assembler file text saying following lines
-   may contain character constants, extra white space, comments, etc.  */
-#define ASM_APP_ON ""
-
-/* Output to assembler file text saying following lines
-   no longer contain unusual constructs.  */
-#define ASM_APP_OFF ""
-
-/* Globalizing directive for a label.  */
-#define GLOBAL_ASM_OP "\t.global\t"
-
-/* This is how to output a reference to a user-level label named NAME.
-   `assemble_name' uses this.  */
-/* We mangle all user labels to provide protection from linking code
-   compiled for different cpus.  */
-/* We work around a dwarfout.c deficiency by watching for labels from it and
-   not adding the '_' prefix nor the cpu suffix.  There is a comment in
-   dwarfout.c that says it should be using (*targetm.asm_out.internal_label).  */
-extern const char *arc_mangle_cpu;
-#define ASM_OUTPUT_LABELREF(FILE, NAME) \
-do {                                                   \
-  if ((NAME)[0] == '.' && (NAME)[1] == 'L')            \
-    fprintf (FILE, "%s", NAME);                                \
-  else                                                 \
-    {                                                  \
-      fputc ('_', FILE);                               \
-      if (TARGET_MANGLE_CPU && arc_mangle_cpu != NULL) \
-       fprintf (FILE, "%s_", arc_mangle_cpu);          \
-      fprintf (FILE, "%s", NAME);                      \
-    }                                                  \
-} while (0)
-
-/* Assembler pseudo-op to equate one value with another.  */
-/* ??? This is needed because dwarfout.c provides a default definition too
-   late for defaults.h (which contains the default definition of ASM_OUTPUT_DEF
-   that we use).  */
-#define SET_ASM_OP "\t.set\t"
-
-/* How to refer to registers in assembler output.
-   This sequence is indexed by compiler's hard-register-number (see above).  */
-#define REGISTER_NAMES \
-{"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",               \
- "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",         \
- "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",       \
- "r24", "r25", "r26", "fp", "sp", "ilink1", "ilink2", "blink", \
- "r32", "r33", "r34", "r35", "r36", "r37", "r38", "r39",       \
- "r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47",       \
- "r48", "r49", "r50", "r51", "r52", "r53", "r54", "r55",       \
- "r56", "r57", "r58", "r59", "lp_count", "cc"}
-
-/* Entry to the insn conditionalizer.  */
-#define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS) \
-arc_final_prescan_insn (INSN, OPVEC, NOPERANDS)
-
-/* A C expression which evaluates to true if CODE is a valid
-   punctuation character for use in the `PRINT_OPERAND' macro.  */
-extern char arc_punct_chars[256];
-#define PRINT_OPERAND_PUNCT_VALID_P(CHAR) \
-arc_punct_chars[(unsigned char) (CHAR)]
-
-/* Print operand X (an rtx) in assembler syntax to file FILE.
-   CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
-   For `%' followed by punctuation, CODE is the punctuation and X is null.  */
-#define PRINT_OPERAND(FILE, X, CODE) \
-arc_print_operand (FILE, X, 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 ADDR.  ADDR is an RTL expression.  */
-#define PRINT_OPERAND_ADDRESS(FILE, ADDR) \
-arc_print_operand_address (FILE, ADDR)
-
-/* This is how to output an element of a case-vector that is absolute.  */
-#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE)  \
-do {                                                   \
-  char label[30];                                      \
-  ASM_GENERATE_INTERNAL_LABEL (label, "L", VALUE);     \
-  fprintf (FILE, "\t.word %%st(");                     \
-  assemble_name (FILE, label);                         \
-  fprintf (FILE, ")\n");                               \
-} while (0)
-
-/* This is how to output an element of a case-vector that is relative.  */
-#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
-do {                                                   \
-  char label[30];                                      \
-  ASM_GENERATE_INTERNAL_LABEL (label, "L", VALUE);     \
-  fprintf (FILE, "\t.word %%st(");                     \
-  assemble_name (FILE, label);                         \
-  fprintf (FILE, "-");                                 \
-  ASM_GENERATE_INTERNAL_LABEL (label, "L", REL);       \
-  assemble_name (FILE, label);                         \
-  fprintf (FILE, ")\n");                               \
-} while (0)
-
-/* The desired alignment for the location counter at the beginning
-   of a loop.  */
-/* On the ARC, align loops to 32 byte boundaries (cache line size)
-   if -malign-loops.  */
-#define LOOP_ALIGN(LABEL) (TARGET_ALIGN_LOOPS ? 5 : 0)
-
-/* This is how to output an assembler line
-   that says to advance the location counter
-   to a multiple of 2**LOG bytes.  */
-#define ASM_OUTPUT_ALIGN(FILE,LOG) \
-do { if ((LOG) != 0) fprintf (FILE, "\t.align %d\n", 1 << (LOG)); } while (0)
-\f
-/* Debugging information.  */
-
-/* Generate DBX and DWARF debugging information.  */
-#define DBX_DEBUGGING_INFO 1
-
-/* Prefer STABS (for now).  */
-#undef PREFERRED_DEBUGGING_TYPE
-#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
-
-/* Turn off splitting of long stabs.  */
-#define DBX_CONTIN_LENGTH 0
-\f
-/* Miscellaneous.  */
-
-/* Specify the machine mode that this machine uses
-   for the index in the tablejump instruction.  */
-#define CASE_VECTOR_MODE Pmode
-
-/* Define if operations between registers always perform the operation
-   on the full register even if a narrower mode is specified.  */
-#define WORD_REGISTER_OPERATIONS
-
-/* Define if loading in MODE, an integral mode narrower than BITS_PER_WORD
-   will either zero-extend or sign-extend.  The value of this macro should
-   be the code that says which one of the two operations is implicitly
-   done, UNKNOWN if none.  */
-#define LOAD_EXTEND_OP(MODE) ZERO_EXTEND
-
-/* Max number of bytes we can move from memory to memory
-   in one reasonably fast instruction.  */
-#define MOVE_MAX 4
-
-/* Define this to be nonzero if shift instructions ignore all but the low-order
-   few bits.  */
-#define SHIFT_COUNT_TRUNCATED 1
-
-/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
-   is done just by pretending it is already truncated.  */
-#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
-
-/* Specify the machine mode that pointers have.
-   After generation of rtl, the compiler makes no further distinction
-   between pointers and any other objects of this machine mode.  */
-/* ??? The arc doesn't have full 32-bit pointers, but making this PSImode has
-   its own problems (you have to add extendpsisi2 and trucnsipsi2 but how does
-   one do it without getting excess code?).  Try to avoid it.  */
-#define Pmode SImode
-
-/* A function address in a call instruction.  */
-#define FUNCTION_MODE SImode
-
-/* alloca should avoid clobbering the old register save area.  */
-/* ??? Not defined in tm.texi.  */
-#define SETJMP_VIA_SAVE_AREA
-\f
-/* ARC function types.  */
-enum arc_function_type {
-  ARC_FUNCTION_UNKNOWN, ARC_FUNCTION_NORMAL,
-  /* These are interrupt handlers.  The name corresponds to the register
-     name that contains the return address.  */
-  ARC_FUNCTION_ILINK1, ARC_FUNCTION_ILINK2
-};
-#define ARC_INTERRUPT_P(TYPE) \
-((TYPE) == ARC_FUNCTION_ILINK1 || (TYPE) == ARC_FUNCTION_ILINK2)
-/* Compute the type of a function from its DECL.  */
diff --git a/gcc/config/arc/arc.md b/gcc/config/arc/arc.md
deleted file mode 100644 (file)
index 09e47da..0000000
+++ /dev/null
@@ -1,1376 +0,0 @@
-;; Machine description of the Argonaut ARC cpu for GNU C compiler
-;; Copyright (C) 1994, 1997, 1998, 1999, 2000, 2004, 2005, 2007, 2008
-;; Free Software Foundation, 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 3, 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 COPYING3.  If not see
-;; <http://www.gnu.org/licenses/>.
-
-;; See file "rtl.def" for documentation on define_insn, match_*, et. al.
-
-;; ??? This is an old port, and is undoubtedly suffering from bit rot.
-\f
-;; Insn type.  Used to default other attribute values.
-
-(define_attr "type"
-  "move,load,store,cmove,unary,binary,compare,shift,mul,uncond_branch,branch,call,call_no_delay_slot,multi,misc"
-  (const_string "binary"))
-
-;; Length (in # of insns, long immediate constants counted too).
-;; ??? There's a nasty interaction between the conditional execution fsm
-;; and insn lengths: insns with shimm values cannot be conditionally executed.
-(define_attr "length" ""
-  (cond [(eq_attr "type" "load")
-        (if_then_else (match_operand 1 "long_immediate_loadstore_operand" "")
-                      (const_int 2) (const_int 1))
-
-        (eq_attr "type" "store")
-        (if_then_else (match_operand 0 "long_immediate_loadstore_operand" "")
-                      (const_int 2) (const_int 1))
-
-        (eq_attr "type" "move,unary,compare")
-        (if_then_else (match_operand 1 "long_immediate_operand" "")
-                      (const_int 2) (const_int 1))
-
-        (eq_attr "type" "binary,mul")
-        (if_then_else (match_operand 2 "long_immediate_operand" "")
-                      (const_int 2) (const_int 1))
-
-        (eq_attr "type" "cmove")
-        (if_then_else (match_operand 2 "register_operand" "")
-                      (const_int 1) (const_int 2))
-
-        (eq_attr "type" "multi") (const_int 2)
-       ]
-
-       (const_int 1)))
-
-;; The length here is the length of a single asm.  Unfortunately it might be
-;; 1 or 2 so we must allow for 2.  That's ok though.  How often will users
-;; lament asm's not being put in delay slots?
-(define_asm_attributes
-  [(set_attr "length" "2")
-   (set_attr "type" "multi")])
-
-;; Condition codes: this one is used by final_prescan_insn to speed up
-;; conditionalizing instructions.  It saves having to scan the rtl to see if
-;; it uses or alters the condition codes.
-
-;; USE: This insn uses the condition codes (e.g.: a conditional branch).
-;; CANUSE: This insn can use the condition codes (for conditional execution).
-;; SET: All condition codes are set by this insn.
-;; SET_ZN: the Z and N flags are set by this insn.
-;; SET_ZNC: the Z, N, and C flags are set by this insn.
-;; CLOB: The condition codes are set to unknown values by this insn.
-;; NOCOND: This insn can't use and doesn't affect the condition codes.
-
-(define_attr "cond" "use,canuse,set,set_zn,set_znc,clob,nocond"
-  (cond [(and (eq_attr "type" "unary,binary,move")
-             (eq_attr "length" "1"))
-        (const_string "canuse")
-
-        (eq_attr "type" "compare")
-        (const_string "set")
-
-        (eq_attr "type" "cmove,branch")
-        (const_string "use")
-
-        (eq_attr "type" "multi,misc")
-        (const_string "clob")
-        ]
-
-        (const_string "nocond")))
-\f
-;; Delay slots.
-
-(define_attr "in_delay_slot" "false,true"
-  (cond [(eq_attr "type" "uncond_branch,branch,call,call_no_delay_slot,multi")
-        (const_string "false")
-        ]
-
-        (if_then_else (eq_attr "length" "1")
-                      (const_string "true")
-                      (const_string "false"))))
-
-(define_delay (eq_attr "type" "call")
-  [(eq_attr "in_delay_slot" "true")
-   (eq_attr "in_delay_slot" "true")
-   (eq_attr "in_delay_slot" "true")])
-
-(define_delay (eq_attr "type" "branch,uncond_branch")
-  [(eq_attr "in_delay_slot" "true")
-   (eq_attr "in_delay_slot" "true")
-   (eq_attr "in_delay_slot" "true")])
-\f   
-;; Scheduling description for the ARC
-
-(define_cpu_unit "branch")
-
-(define_insn_reservation "any_insn" 1 (eq_attr "type" "!load,compare,branch")
-                        "nothing")
-
-;; 1) A conditional jump cannot immediately follow the insn setting the flags.
-;; This isn't a complete solution as it doesn't come with guarantees.  That
-;; is done in the branch patterns and in arc_print_operand.  This exists to
-;; avoid inserting a nop when we can.
-
-(define_insn_reservation "compare" 1 (eq_attr "type" "compare")
-                        "nothing,branch")
-
-(define_insn_reservation "branch" 1 (eq_attr "type" "branch")
-                        "branch")
-
-;; 2) References to loaded registers should wait a cycle.
-
-;; Memory with load-delay of 1 (i.e., 2 cycle load).
-
-(define_insn_reservation "memory" 2 (eq_attr "type" "load")
-                        "nothing")
-\f
-;; Move instructions.
-
-(define_expand "movqi"
-  [(set (match_operand:QI 0 "general_operand" "")
-       (match_operand:QI 1 "general_operand" ""))]
-  ""
-  "
-{
-  /* Everything except mem = const or mem = mem can be done easily.  */
-
-  if (GET_CODE (operands[0]) == MEM)
-    operands[1] = force_reg (QImode, operands[1]);
-}")
-
-(define_insn "*movqi_insn"
-  [(set (match_operand:QI 0 "move_dest_operand" "=r,r,r,m")
-       (match_operand:QI 1 "move_src_operand" "rI,Ji,m,r"))]
-;; ??? Needed?
-  "register_operand (operands[0], QImode)
-   || register_operand (operands[1], QImode)"
-  "@
-   mov%? %0,%1
-   mov%? %0,%1
-   ldb%U1%V1 %0,%1
-   stb%U0%V0 %1,%0"
-  [(set_attr "type" "move,move,load,store")])
-
-;; ??? This may never match since there's no cmpqi insn.
-
-(define_insn "*movqi_set_cc_insn"
-  [(set (reg:CCZN 61) (compare:CCZN
-                      (sign_extend:SI (match_operand:QI 1 "move_src_operand" "rIJi"))
-                      (const_int 0)))
-   (set (match_operand:QI 0 "move_dest_operand" "=r")
-       (match_dup 1))]
-  ""
-  "mov%?.f %0,%1"
-  [(set_attr "type" "move")
-   (set_attr "cond" "set_zn")])
-
-(define_expand "movhi"
-  [(set (match_operand:HI 0 "general_operand" "")
-       (match_operand:HI 1 "general_operand" ""))]
-  ""
-  "
-{
-  /* Everything except mem = const or mem = mem can be done easily.  */
-
-  if (GET_CODE (operands[0]) == MEM)
-    operands[1] = force_reg (HImode, operands[1]);
-}")
-
-(define_insn "*movhi_insn"
-  [(set (match_operand:HI 0 "move_dest_operand" "=r,r,r,m")
-       (match_operand:HI 1 "move_src_operand" "rI,Ji,m,r"))]
-  "register_operand (operands[0], HImode)
-   || register_operand (operands[1], HImode)"
-  "@
-   mov%? %0,%1
-   mov%? %0,%1
-   ldw%U1%V1 %0,%1
-   stw%U0%V0 %1,%0"
-  [(set_attr "type" "move,move,load,store")])
-
-;; ??? Will this ever match?
-
-(define_insn "*movhi_set_cc_insn"
-  [(set (reg:CCZN 61) (compare:CCZN
-                      (sign_extend:SI (match_operand:HI 1 "move_src_operand" "rIJi"))
-                      (const_int 0)))
-   (set (match_operand:HI 0 "move_dest_operand" "=r")
-       (match_dup 1))]
-;; ??? Needed?
-  "register_operand (operands[0], HImode)
-   || register_operand (operands[1], HImode)"
-  "mov%?.f %0,%1"
-  [(set_attr "type" "move")
-   (set_attr "cond" "set_zn")])
-
-(define_expand "movsi"
-  [(set (match_operand:SI 0 "general_operand" "")
-       (match_operand:SI 1 "general_operand" ""))]
-  ""
-  "
-{
-  /* Everything except mem = const or mem = mem can be done easily.  */
-
-  if (GET_CODE (operands[0]) == MEM)
-    operands[1] = force_reg (SImode, operands[1]);
-}")
-
-(define_insn "*movsi_insn"
-  [(set (match_operand:SI 0 "move_dest_operand" "=r,r,r,m")
-       (match_operand:SI 1 "move_src_operand" "rI,GJi,m,r"))]
-  "register_operand (operands[0], SImode)
-   || register_operand (operands[1], SImode)"
-  "@
-   mov%? %0,%1
-   mov%? %0,%S1
-   ld%U1%V1 %0,%1
-   st%U0%V0 %1,%0"
-  [(set_attr "type" "move,move,load,store")])
-
-(define_insn "*movsi_set_cc_insn"
-  [(set (reg:CCZN 61) (compare:CCZN
-                      (match_operand:SI 1 "move_src_operand" "rIJi")
-                      (const_int 0)))
-   (set (match_operand:SI 0 "move_dest_operand" "=r")
-       (match_dup 1))]
-  "register_operand (operands[0], SImode)
-   || register_operand (operands[1], SImode)"
-  "mov%?.f %0,%S1"
-  [(set_attr "type" "move")
-   (set_attr "cond" "set_zn")])
-
-(define_expand "movdi"
-  [(set (match_operand:DI 0 "general_operand" "")
-       (match_operand:DI 1 "general_operand" ""))]
-  ""
-  "
-{
-  /* Everything except mem = const or mem = mem can be done easily.  */
-
-  if (GET_CODE (operands[0]) == MEM)
-    operands[1] = force_reg (DImode, operands[1]);
-}")
-
-(define_insn "*movdi_insn"
-  [(set (match_operand:DI 0 "move_dest_operand" "=r,r,r,m")
-       (match_operand:DI 1 "move_double_src_operand" "r,HK,m,r"))]
-  "register_operand (operands[0], DImode)
-   || register_operand (operands[1], DImode)"
-  "*
-{
-  switch (which_alternative)
-    {
-    case 0 :
-      /* We normally copy the low-numbered register first.  However, if
-        the first register operand 0 is the same as the second register of
-        operand 1, we must copy in the opposite order.  */
-      if (REGNO (operands[0]) == REGNO (operands[1]) + 1)
-       return \"mov %R0,%R1\;mov %0,%1\";
-      else
-       return \"mov %0,%1\;mov %R0,%R1\";
-    case 1 :
-      return \"mov %0,%L1\;mov %R0,%H1\";
-    case 2 :
-      /* If the low-address word is used in the address, we must load it
-        last.  Otherwise, load it first.  Note that we cannot have
-        auto-increment in that case since the address register is known to be
-        dead.  */
-      if (refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1,
-                            operands [1], 0))
-         return \"ld%V1 %R0,%R1\;ld%V1 %0,%1\";
-      else
-         return \"ld%V1 %0,%1\;ld%V1 %R0,%R1\";
-    case 3 :
-      return \"st%V0 %1,%0\;st%V0 %R1,%R0\";
-    default:
-      gcc_unreachable ();
-    }
-}"
-  [(set_attr "type" "move,move,load,store")
-   ;; ??? The ld/st values could be 4 if it's [reg,bignum].
-   (set_attr "length" "2,4,2,2")])
-
-;(define_expand "movdi"
-;  [(set (match_operand:DI 0 "general_operand" "")
-;      (match_operand:DI 1 "general_operand" ""))]
-;  ""
-;  "
-;{
-;  /* Flow doesn't understand that this is effectively a DFmode move.
-;     It doesn't know that all of `operands[0]' is set.  */
-;  emit_clobber (operands[0]);
-;
-;  /* Emit insns that movsi_insn can handle.  */
-;  emit_insn (gen_movsi (operand_subword (operands[0], 0, 0, DImode),
-;                      operand_subword (operands[1], 0, 0, DImode)));
-;  emit_insn (gen_movsi (operand_subword (operands[0], 1, 0, DImode),
-;                      operand_subword (operands[1], 1, 0, DImode)));
-;  DONE;
-;}")
-\f
-;; Floating point move insns.
-
-(define_expand "movsf"
-  [(set (match_operand:SF 0 "general_operand" "")
-       (match_operand:SF 1 "general_operand" ""))]
-  ""
-  "
-{
-  /* Everything except mem = const or mem = mem can be done easily.  */
-  if (GET_CODE (operands[0]) == MEM)
-    operands[1] = force_reg (SFmode, operands[1]);
-}")
-
-(define_insn "*movsf_insn"
-  [(set (match_operand:SF 0 "move_dest_operand" "=r,r,r,m")
-       (match_operand:SF 1 "move_src_operand" "r,E,m,r"))]
-  "register_operand (operands[0], SFmode)
-   || register_operand (operands[1], SFmode)"
-  "@
-   mov%? %0,%1
-   mov%? %0,%1 ; %A1
-   ld%U1%V1 %0,%1
-   st%U0%V0 %1,%0"
-  [(set_attr "type" "move,move,load,store")])
-
-(define_expand "movdf"
-  [(set (match_operand:DF 0 "general_operand" "")
-       (match_operand:DF 1 "general_operand" ""))]
-  ""
-  "
-{
-  /* Everything except mem = const or mem = mem can be done easily.  */
-  if (GET_CODE (operands[0]) == MEM)
-    operands[1] = force_reg (DFmode, operands[1]);
-}")
-
-(define_insn "*movdf_insn"
-  [(set (match_operand:DF 0 "move_dest_operand" "=r,r,r,m")
-       (match_operand:DF 1 "move_double_src_operand" "r,E,m,r"))]
-  "register_operand (operands[0], DFmode)
-   || register_operand (operands[1], DFmode)"
-  "*
-{
-  switch (which_alternative)
-    {
-    case 0 :
-      /* We normally copy the low-numbered register first.  However, if
-        the first register operand 0 is the same as the second register of
-        operand 1, we must copy in the opposite order.  */
-      if (REGNO (operands[0]) == REGNO (operands[1]) + 1)
-       return \"mov %R0,%R1\;mov %0,%1\";
-      else
-       return \"mov %0,%1\;mov %R0,%R1\";
-    case 1 :
-      return \"mov %0,%L1\;mov %R0,%H1 ; %A1\";
-    case 2 :
-      /* If the low-address word is used in the address, we must load it
-        last.  Otherwise, load it first.  Note that we cannot have
-        auto-increment in that case since the address register is known to be
-        dead.  */
-      if (refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1,
-                            operands [1], 0))
-       return \"ld%V1 %R0,%R1\;ld%V1 %0,%1\";
-      else
-       return \"ld%V1 %0,%1\;ld%V1 %R0,%R1\";
-    case 3 :
-      return \"st%V0 %1,%0\;st%V0 %R1,%R0\";
-    default:
-      gcc_unreachable ();
-    }
-}"
-  [(set_attr "type" "move,move,load,store")
-   ;; ??? The ld/st values could be 4 if it's [reg,bignum].
-   (set_attr "length" "2,4,2,2")])
-
-;(define_expand "movdf"
-;  [(set (match_operand:DF 0 "general_operand" "")
-;      (match_operand:DF 1 "general_operand" ""))]
-;  ""
-;  "
-;{
-;  /* Flow doesn't understand that this is effectively a DFmode move.
-;     It doesn't know that all of `operands[0]' is set.  */
-;  emit_clobber (operands[0]);
-;
-;  /* Emit insns that movsi_insn can handle.  */
-;  emit_insn (gen_movsi (operand_subword (operands[0], 0, 0, DFmode),
-;                      operand_subword (operands[1], 0, 0, DFmode)));
-;  emit_insn (gen_movsi (operand_subword (operands[0], 1, 0, DFmode),
-;                      operand_subword (operands[1], 1, 0, DFmode)));
-;  DONE;
-;}")
-\f
-;; Load/Store with update instructions.
-;;
-;; Some of these we can get by using pre-decrement or pre-increment, but the
-;; hardware can also do cases where the increment is not the size of the
-;; object.
-;;
-;; In all these cases, we use operands 0 and 1 for the register being
-;; incremented because those are the operands that local-alloc will
-;; tie and these are the pair most likely to be tieable (and the ones
-;; that will benefit the most).
-;;
-;; We use match_operator here because we need to know whether the memory
-;; object is volatile or not.
-
-(define_insn "*loadqi_update"
-  [(set (match_operand:QI 3 "register_operand" "=r,r")
-       (match_operator:QI 4 "load_update_operand"
-        [(match_operand:SI 1 "register_operand" "0,0")
-         (match_operand:SI 2 "nonmemory_operand" "rI,J")]))
-   (set (match_operand:SI 0 "register_operand" "=r,r")
-       (plus:SI (match_dup 1) (match_dup 2)))]
-  ""
-  "ldb.a%V4 %3,[%0,%2]"
-  [(set_attr "type" "load,load")
-   (set_attr "length" "1,2")])
-
-(define_insn "*load_zeroextendqisi_update"
-  [(set (match_operand:SI 3 "register_operand" "=r,r")
-       (zero_extend:SI (match_operator:QI 4 "load_update_operand"
-                        [(match_operand:SI 1 "register_operand" "0,0")
-                         (match_operand:SI 2 "nonmemory_operand" "rI,J")])))
-   (set (match_operand:SI 0 "register_operand" "=r,r")
-       (plus:SI (match_dup 1) (match_dup 2)))]
-  ""
-  "ldb.a%V4 %3,[%0,%2]"
-  [(set_attr "type" "load,load")
-   (set_attr "length" "1,2")])
-
-(define_insn "*load_signextendqisi_update"
-  [(set (match_operand:SI 3 "register_operand" "=r,r")
-       (sign_extend:SI (match_operator:QI 4 "load_update_operand"
-                        [(match_operand:SI 1 "register_operand" "0,0")
-                         (match_operand:SI 2 "nonmemory_operand" "rI,J")])))
-   (set (match_operand:SI 0 "register_operand" "=r,r")
-       (plus:SI (match_dup 1) (match_dup 2)))]
-  ""
-  "ldb.x.a%V4 %3,[%0,%2]"
-  [(set_attr "type" "load,load")
-   (set_attr "length" "1,2")])
-
-(define_insn "*storeqi_update"
-  [(set (match_operator:QI 4 "store_update_operand"
-        [(match_operand:SI 1 "register_operand" "0")
-         (match_operand:SI 2 "short_immediate_operand" "I")])
-       (match_operand:QI 3 "register_operand" "r"))
-   (set (match_operand:SI 0 "register_operand" "=r")
-       (plus:SI (match_dup 1) (match_dup 2)))]
-  ""
-  "stb.a%V4 %3,[%0,%2]"
-  [(set_attr "type" "store")
-   (set_attr "length" "1")])
-
-(define_insn "*loadhi_update"
-  [(set (match_operand:HI 3 "register_operand" "=r,r")
-       (match_operator:HI 4 "load_update_operand"
-        [(match_operand:SI 1 "register_operand" "0,0")
-         (match_operand:SI 2 "nonmemory_operand" "rI,J")]))
-   (set (match_operand:SI 0 "register_operand" "=r,r")
-       (plus:SI (match_dup 1) (match_dup 2)))]
-  ""
-  "ldw.a%V4 %3,[%0,%2]"
-  [(set_attr "type" "load,load")
-   (set_attr "length" "1,2")])
-
-(define_insn "*load_zeroextendhisi_update"
-  [(set (match_operand:SI 3 "register_operand" "=r,r")
-       (zero_extend:SI (match_operator:HI 4 "load_update_operand"
-                        [(match_operand:SI 1 "register_operand" "0,0")
-                         (match_operand:SI 2 "nonmemory_operand" "rI,J")])))
-   (set (match_operand:SI 0 "register_operand" "=r,r")
-       (plus:SI (match_dup 1) (match_dup 2)))]
-  ""
-  "ldw.a%V4 %3,[%0,%2]"
-  [(set_attr "type" "load,load")
-   (set_attr "length" "1,2")])
-
-(define_insn "*load_signextendhisi_update"
-  [(set (match_operand:SI 3 "register_operand" "=r,r")
-       (sign_extend:SI (match_operator:HI 4 "load_update_operand"
-                        [(match_operand:SI 1 "register_operand" "0,0")
-                         (match_operand:SI 2 "nonmemory_operand" "rI,J")])))
-   (set (match_operand:SI 0 "register_operand" "=r,r")
-       (plus:SI (match_dup 1) (match_dup 2)))]
-  ""
-  "ldw.x.a%V4 %3,[%0,%2]"
-  [(set_attr "type" "load,load")
-   (set_attr "length" "1,2")])
-
-(define_insn "*storehi_update"
-  [(set (match_operator:HI 4 "store_update_operand"
-        [(match_operand:SI 1 "register_operand" "0")
-         (match_operand:SI 2 "short_immediate_operand" "I")])
-       (match_operand:HI 3 "register_operand" "r"))
-   (set (match_operand:SI 0 "register_operand" "=r")
-       (plus:SI (match_dup 1) (match_dup 2)))]
-  ""
-  "stw.a%V4 %3,[%0,%2]"
-  [(set_attr "type" "store")
-   (set_attr "length" "1")])
-
-(define_insn "*loadsi_update"
-  [(set (match_operand:SI 3 "register_operand" "=r,r")
-       (match_operator:SI 4 "load_update_operand"
-        [(match_operand:SI 1 "register_operand" "0,0")
-         (match_operand:SI 2 "nonmemory_operand" "rI,J")]))
-   (set (match_operand:SI 0 "register_operand" "=r,r")
-       (plus:SI (match_dup 1) (match_dup 2)))]
-  ""
-  "ld.a%V4 %3,[%0,%2]"
-  [(set_attr "type" "load,load")
-   (set_attr "length" "1,2")])
-
-(define_insn "*storesi_update"
-  [(set (match_operator:SI 4 "store_update_operand"
-        [(match_operand:SI 1 "register_operand" "0")
-         (match_operand:SI 2 "short_immediate_operand" "I")])
-       (match_operand:SI 3 "register_operand" "r"))
-   (set (match_operand:SI 0 "register_operand" "=r")
-       (plus:SI (match_dup 1) (match_dup 2)))]
-  ""
-  "st.a%V4 %3,[%0,%2]"
-  [(set_attr "type" "store")
-   (set_attr "length" "1")])
-
-(define_insn "*loadsf_update"
-  [(set (match_operand:SF 3 "register_operand" "=r,r")
-       (match_operator:SF 4 "load_update_operand"
-        [(match_operand:SI 1 "register_operand" "0,0")
-         (match_operand:SI 2 "nonmemory_operand" "rI,J")]))
-   (set (match_operand:SI 0 "register_operand" "=r,r")
-       (plus:SI (match_dup 1) (match_dup 2)))]
-  ""
-  "ld.a%V4 %3,[%0,%2]"
-  [(set_attr "type" "load,load")
-   (set_attr "length" "1,2")])
-
-(define_insn "*storesf_update"
-  [(set (match_operator:SF 4 "store_update_operand"
-        [(match_operand:SI 1 "register_operand" "0")
-         (match_operand:SI 2 "short_immediate_operand" "I")])
-       (match_operand:SF 3 "register_operand" "r"))
-   (set (match_operand:SI 0 "register_operand" "=r")
-       (plus:SI (match_dup 1) (match_dup 2)))]
-  ""
-  "st.a%V4 %3,[%0,%2]"
-  [(set_attr "type" "store")
-   (set_attr "length" "1")])
-\f
-;; Conditional move instructions.
-
-(define_expand "movsicc"
-  [(set (match_operand:SI 0 "register_operand" "")
-       (if_then_else:SI (match_operand 1 "comparison_operator" "")
-                        (match_operand:SI 2 "nonmemory_operand" "")
-                        (match_operand:SI 3 "register_operand" "")))]
-  ""
-  "
-{
-  enum rtx_code code = GET_CODE (operands[1]);
-  rtx cc_reg = gen_compare_reg (code, XEXP (operands[1], 0),
-                               XEXP (operands[1], 1));
-  operands[1] = gen_rtx_fmt_ee (code, VOIDmode, cc_reg, const0_rtx);
-}")
-
-(define_expand "movsfcc"
-  [(set (match_operand:SF 0 "register_operand" "")
-       (if_then_else:SF (match_operand 1 "comparison_operator" "")
-                        (match_operand:SF 2 "nonmemory_operand" "")
-                        (match_operand:SF 3 "register_operand" "")))]
-  ""
-  "
-{
-  enum rtx_code code = GET_CODE (operands[1]);
-  rtx cc_reg = gen_compare_reg (code, XEXP (operands[1], 0),
-                               XEXP (operands[1], 1));
-  operands[1] = gen_rtx_fmt_ee (code, VOIDmode, cc_reg, const0_rtx);
-}")
-
-(define_insn "*movsicc_insn"
-  [(set (match_operand:SI 0 "register_operand" "=r")
-       (if_then_else:SI (match_operand 1 "comparison_operator" "")
-                        (match_operand:SI 2 "nonmemory_operand" "rJi")
-                        (match_operand:SI 3 "register_operand" "0")))]
-  ""
-  "mov.%d1 %0,%S2"
-  [(set_attr "type" "cmove")])
-
-(define_insn "*movsfcc_insn"
-  [(set (match_operand:SF 0 "register_operand" "=r,r")
-       (if_then_else:SF (match_operand 1 "comparison_operator" "")
-                        (match_operand:SF 2 "nonmemory_operand" "r,E")
-                        (match_operand:SF 3 "register_operand" "0,0")))]
-  ""
-  "@
-   mov.%d1 %0,%2
-   mov.%d1 %0,%2 ; %A2"
-  [(set_attr "type" "cmove,cmove")])
-
-\f
-;; Zero extension instructions.
-;; ??? We don't support volatile memrefs here, but I'm not sure why.
-
-(define_insn "zero_extendqihi2"
-  [(set (match_operand:HI 0 "register_operand" "=r,r")
-       (zero_extend:HI (match_operand:QI 1 "nonvol_nonimm_operand" "r,m")))]
-  ""
-  "@
-   extb%? %0,%1
-   ldb%U1 %0,%1"
-  [(set_attr "type" "unary,load")])
-
-(define_insn "*zero_extendqihi2_set_cc_insn"
-  [(set (reg:CCZN 61) (compare:CCZN
-                      (zero_extend:SI (match_operand:QI 1 "register_operand" "r"))
-                      (const_int 0)))
-   (set (match_operand:HI 0 "register_operand" "=r")
-       (zero_extend:HI (match_dup 1)))]
-  ""
-  "extb%?.f %0,%1"
-  [(set_attr "type" "unary")
-   (set_attr "cond" "set_zn")])
-
-(define_insn "zero_extendqisi2"
-  [(set (match_operand:SI 0 "register_operand" "=r,r")
-       (zero_extend:SI (match_operand:QI 1 "nonvol_nonimm_operand" "r,m")))]
-  ""
-  "@
-   extb%? %0,%1
-   ldb%U1 %0,%1"
-  [(set_attr "type" "unary,load")])
-
-(define_insn "*zero_extendqisi2_set_cc_insn"
-  [(set (reg:CCZN 61) (compare:CCZN
-                      (zero_extend:SI (match_operand:QI 1 "register_operand" "r"))
-                      (const_int 0)))
-   (set (match_operand:SI 0 "register_operand" "=r")
-       (zero_extend:SI (match_dup 1)))]
-  ""
-  "extb%?.f %0,%1"
-  [(set_attr "type" "unary")
-   (set_attr "cond" "set_zn")])
-
-(define_insn "zero_extendhisi2"
-  [(set (match_operand:SI 0 "register_operand" "=r,r")
-       (zero_extend:SI (match_operand:HI 1 "nonvol_nonimm_operand" "r,m")))]
-  ""
-  "@
-   extw%? %0,%1
-   ldw%U1 %0,%1"
-  [(set_attr "type" "unary,load")])
-
-(define_insn "*zero_extendhisi2_set_cc_insn"
-  [(set (reg:CCZN 61) (compare:CCZN
-                      (zero_extend:SI (match_operand:HI 1 "register_operand" "r"))
-                      (const_int 0)))
-   (set (match_operand:SI 0 "register_operand" "=r")
-       (zero_extend:SI (match_dup 1)))]
-  ""
-  "extw%?.f %0,%1"
-  [(set_attr "type" "unary")
-   (set_attr "cond" "set_zn")])
-\f
-;; Sign extension instructions.
-
-(define_insn "extendqihi2"
-  [(set (match_operand:HI 0 "register_operand" "=r,r")
-       (sign_extend:HI (match_operand:QI 1 "nonvol_nonimm_operand" "r,m")))]
-  ""
-  "@
-   sexb%? %0,%1
-   ldb.x%U1 %0,%1"
-  [(set_attr "type" "unary,load")])
-
-(define_insn "*extendqihi2_set_cc_insn"
-  [(set (reg:CCZN 61) (compare:CCZN
-                      (sign_extend:SI (match_operand:QI 1 "register_operand" "r"))
-                      (const_int 0)))
-   (set (match_operand:HI 0 "register_operand" "=r")
-       (sign_extend:HI (match_dup 1)))]
-  ""
-  "sexb%?.f %0,%1"
-  [(set_attr "type" "unary")
-   (set_attr "cond" "set_zn")])
-
-(define_insn "extendqisi2"
-  [(set (match_operand:SI 0 "register_operand" "=r,r")
-       (sign_extend:SI (match_operand:QI 1 "nonvol_nonimm_operand" "r,m")))]
-  ""
-  "@
-   sexb%? %0,%1
-   ldb.x%U1 %0,%1"
-  [(set_attr "type" "unary,load")])
-
-(define_insn "*extendqisi2_set_cc_insn"
-  [(set (reg:CCZN 61) (compare:CCZN
-                      (sign_extend:SI (match_operand:QI 1 "register_operand" "r"))
-                      (const_int 0)))
-   (set (match_operand:SI 0 "register_operand" "=r")
-       (sign_extend:SI (match_dup 1)))]
-  ""
-  "sexb%?.f %0,%1"
-  [(set_attr "type" "unary")
-   (set_attr "cond" "set_zn")])
-
-(define_insn "extendhisi2"
-  [(set (match_operand:SI 0 "register_operand" "=r,r")
-       (sign_extend:SI (match_operand:HI 1 "nonvol_nonimm_operand" "r,m")))]
-  ""
-  "@
-   sexw%? %0,%1
-   ldw.x%U1 %0,%1"
-  [(set_attr "type" "unary,load")])
-
-(define_insn "*extendhisi2_set_cc_insn"
-  [(set (reg:CCZN 61) (compare:CCZN
-                      (sign_extend:SI (match_operand:HI 1 "register_operand" "r"))
-                      (const_int 0)))
-   (set (match_operand:SI 0 "register_operand" "=r")
-       (sign_extend:SI (match_dup 1)))]
-  ""
-  "sexw%?.f %0,%1"
-  [(set_attr "type" "unary")
-   (set_attr "cond" "set_zn")])
-\f
-;; Arithmetic instructions.
-
-(define_insn "addsi3"
-  [(set (match_operand:SI 0 "register_operand" "=r")
-       (plus:SI (match_operand:SI 1 "register_operand" "%r")
-                (match_operand:SI 2 "nonmemory_operand" "rIJ")))]
-  ""
-  "add%? %0,%1,%2")
-
-(define_insn "*addsi3_set_cc_insn"
-  [(set (reg:CC 61) (compare:CC
-                    (plus:SI (match_operand:SI 1 "register_operand" "%r")
-                             (match_operand:SI 2 "nonmemory_operand" "rIJ"))
-                    (const_int 0)))
-   (set (match_operand:SI 0 "register_operand" "=r")
-       (plus:SI (match_dup 1)
-                (match_dup 2)))]
-  ""
-  "add%?.f %0,%1,%2"
-  [(set_attr "cond" "set")])
-
-(define_insn "adddi3"
-  [(set (match_operand:DI 0 "register_operand" "=r")
-       (plus:DI (match_operand:DI 1 "nonmemory_operand" "%r")
-                (match_operand:DI 2 "nonmemory_operand" "ri")))
-   (clobber (reg:CC 61))]
-  ""
-  "*
-{
-  rtx op2 = operands[2];
-
-  if (GET_CODE (op2) == CONST_INT)
-    {
-      int sign = INTVAL (op2);
-      if (sign < 0)
-       return \"add.f %L0,%L1,%2\;adc %H0,%H1,-1\";
-      else
-       return \"add.f %L0,%L1,%2\;adc %H0,%H1,0\";
-    }
-  else
-    return \"add.f %L0,%L1,%L2\;adc %H0,%H1,%H2\";
-}"
-  [(set_attr "length" "2")])
-
-(define_insn "subsi3"
-  [(set (match_operand:SI 0 "register_operand" "=r")
-       (minus:SI (match_operand:SI 1 "register_operand" "r")
-                 (match_operand:SI 2 "nonmemory_operand" "rIJ")))]
-  ""
-  "sub%? %0,%1,%2")
-
-(define_insn "*subsi3_set_cc_insn"
-  [(set (reg:CC 61) (compare:CC
-                    (minus:SI (match_operand:SI 1 "register_operand" "%r")
-                              (match_operand:SI 2 "nonmemory_operand" "rIJ"))
-                    (const_int 0)))
-   (set (match_operand:SI 0 "register_operand" "=r")
-       (minus:SI (match_dup 1)
-                 (match_dup 2)))]
-  ""
-  "sub%?.f %0,%1,%2"
-  [(set_attr "cond" "set")])
-
-(define_insn "subdi3"
-  [(set (match_operand:DI 0 "register_operand" "=r")
-       (minus:DI (match_operand:DI 1 "nonmemory_operand" "r")
-                 (match_operand:DI 2 "nonmemory_operand" "ri")))
-   (clobber (reg:CC 61))]
-  ""
-  "*
-{
-  rtx op2 = operands[2];
-
-  if (GET_CODE (op2) == CONST_INT)
-    {
-      int sign = INTVAL (op2);
-      if (sign < 0)
-       return \"sub.f %L0,%L1,%2\;sbc %H0,%H1,-1\";
-      else
-       return \"sub.f %L0,%L1,%2\;sbc %H0,%H1,0\";
-    }
-  else
-    return \"sub.f %L0,%L1,%L2\;sbc %H0,%H1,%H2\";
-}"
-  [(set_attr "length" "2")])
-\f
-;; Boolean instructions.
-;;
-;; We don't define the DImode versions as expand_binop does a good enough job.
-
-(define_insn "andsi3"
-  [(set (match_operand:SI 0 "register_operand" "=r")
-       (and:SI (match_operand:SI 1 "register_operand" "%r")
-               (match_operand:SI 2 "nonmemory_operand" "rIJ")))]
-  ""
-  "and%? %0,%1,%2")
-
-(define_insn "*andsi3_set_cc_insn"
-  [(set (reg:CCZN 61) (compare:CCZN
-                      (and:SI (match_operand:SI 1 "register_operand" "%r")
-                              (match_operand:SI 2 "nonmemory_operand" "rIJ"))
-                      (const_int 0)))
-   (set (match_operand:SI 0 "register_operand" "=r")
-       (and:SI (match_dup 1)
-               (match_dup 2)))]
-  ""
-  "and%?.f %0,%1,%2"
-  [(set_attr "cond" "set_zn")])
-
-(define_insn "*bicsi3_insn"
-  [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
-       (and:SI (match_operand:SI 1 "nonmemory_operand" "r,r,I,J")
-               (not:SI (match_operand:SI 2 "nonmemory_operand" "rI,J,r,r"))))]
-  ""
-  "bic%? %0,%1,%2"
-  [(set_attr "length" "1,2,1,2")])
-
-(define_insn "*bicsi3_set_cc_insn"
-  [(set (reg:CCZN 61) (compare:CCZN
-                      (and:SI (match_operand:SI 1 "register_operand" "%r")
-                              (not:SI (match_operand:SI 2 "nonmemory_operand" "rIJ")))
-                      (const_int 0)))
-   (set (match_operand:SI 0 "register_operand" "=r")
-       (and:SI (match_dup 1)
-               (not:SI (match_dup 2))))]
-  ""
-  "bic%?.f %0,%1,%2"
-  [(set_attr "cond" "set_zn")])
-
-(define_insn "iorsi3"
-  [(set (match_operand:SI 0 "register_operand" "=r")
-       (ior:SI (match_operand:SI 1 "register_operand" "%r")
-               (match_operand:SI 2 "nonmemory_operand" "rIJ")))]
-  ""
-  "or%? %0,%1,%2")
-
-(define_insn "*iorsi3_set_cc_insn"
-  [(set (reg:CCZN 61) (compare:CCZN
-                      (ior:SI (match_operand:SI 1 "register_operand" "%r")
-                              (match_operand:SI 2 "nonmemory_operand" "rIJ"))
-                      (const_int 0)))
-   (set (match_operand:SI 0 "register_operand" "=r")
-       (ior:SI (match_dup 1)
-               (match_dup 2)))]
-  ""
-  "or%?.f %0,%1,%2"
-  [(set_attr "cond" "set_zn")])
-
-(define_insn "xorsi3"
-  [(set (match_operand:SI 0 "register_operand" "=r")
-       (xor:SI (match_operand:SI 1 "register_operand" "%r")
-               (match_operand:SI 2 "nonmemory_operand" "rIJ")))]
-  ""
-  "xor%? %0,%1,%2")
-
-(define_insn "*xorsi3_set_cc_insn"
-  [(set (reg:CCZN 61) (compare:CCZN
-                      (xor:SI (match_operand:SI 1 "register_operand" "%r")
-                              (match_operand:SI 2 "nonmemory_operand" "rIJ"))
-                      (const_int 0)))
-   (set (match_operand:SI 0 "register_operand" "=r")
-       (xor:SI (match_dup 1)
-               (match_dup 2)))]
-  ""
-  "xor%?.f %0,%1,%2"
-  [(set_attr "cond" "set_zn")])
-
-(define_insn "negsi2"
-  [(set (match_operand:SI 0 "register_operand" "=r")
-       (neg:SI (match_operand:SI 1 "register_operand" "r")))]
-  ""
-  "sub%? %0,0,%1"
-  [(set_attr "type" "unary")])
-
-(define_insn "*negsi2_set_cc_insn"
-  [(set (reg:CC 61) (compare:CC
-                    (neg:SI (match_operand:SI 1 "register_operand" "r"))
-                    (const_int 0)))
-   (set (match_operand:SI 0 "register_operand" "=r")
-       (neg:SI (match_dup 1)))]
-  ""
-  "sub%?.f %0,0,%1"
-  [(set_attr "type" "unary")
-   (set_attr "cond" "set")])
-
-(define_insn "negdi2"
-  [(set (match_operand:DI 0 "register_operand" "=r")
-       (neg:DI (match_operand:DI 1 "register_operand" "r")))
-   (clobber (reg:SI 61))]
-  ""
-  "sub.f %L0,0,%L1\;sbc %H0,0,%H1"
-  [(set_attr "type" "unary")
-   (set_attr "length" "2")])
-
-(define_insn "one_cmplsi2"
-  [(set (match_operand:SI 0 "register_operand" "=r")
-       (not:SI (match_operand:SI 1 "register_operand" "r")))]
-  ""
-  "xor%? %0,%1,-1"
-  [(set_attr "type" "unary")])
-
-(define_insn "*one_cmplsi2_set_cc_insn"
-  [(set (reg:CCZN 61) (compare:CCZN
-                      (not:SI (match_operand:SI 1 "register_operand" "r"))
-                      (const_int 0)))
-   (set (match_operand:SI 0 "register_operand" "=r")
-       (not:SI (match_dup 1)))]
-  ""
-  "xor%?.f %0,%1,-1"
-  [(set_attr "type" "unary")
-   (set_attr "cond" "set_zn")])
-\f
-;; Shift instructions.
-
-(define_expand "ashlsi3"
-  [(set (match_operand:SI 0 "register_operand" "")
-       (ashift:SI (match_operand:SI 1 "register_operand" "")
-                  (match_operand:SI 2 "nonmemory_operand" "")))]
-  ""
-  "
-{
-  if (! TARGET_SHIFTER)
-    {
-      emit_insn (gen_rtx_PARALLEL
-                (VOIDmode,
-                 gen_rtvec (2,
-                            gen_rtx_SET (VOIDmode, operands[0],
-                                         gen_rtx_ASHIFT (SImode, operands[1],
-                                                         operands[2])),
-                            gen_rtx_CLOBBER (VOIDmode,
-                                             gen_rtx_SCRATCH (SImode)))));
-      DONE;
-    }
-}")
-
-(define_expand "ashrsi3"
-  [(set (match_operand:SI 0 "register_operand" "")
-       (ashiftrt:SI (match_operand:SI 1 "register_operand" "")
-                    (match_operand:SI 2 "nonmemory_operand" "")))]
-  ""
-  "
-{
-  if (! TARGET_SHIFTER)
-    {
-      emit_insn (gen_rtx_PARALLEL
-                (VOIDmode,
-                 gen_rtvec (2,
-                            gen_rtx_SET (VOIDmode, operands[0],
-                                         gen_rtx_ASHIFTRT (SImode,
-                                                           operands[1],
-                                                           operands[2])),
-                            gen_rtx_CLOBBER (VOIDmode,
-                                             gen_rtx_SCRATCH (SImode)))));
-      DONE;
-    }
-}")
-
-(define_expand "lshrsi3"
-  [(set (match_operand:SI 0 "register_operand" "")
-       (lshiftrt:SI (match_operand:SI 1 "register_operand" "")
-                    (match_operand:SI 2 "nonmemory_operand" "")))]
-  ""
-  "
-{
-  if (! TARGET_SHIFTER)
-    {
-      emit_insn (gen_rtx_PARALLEL
-                (VOIDmode,
-                 gen_rtvec (2,
-                            gen_rtx_SET (VOIDmode, operands[0],
-                                         gen_rtx_LSHIFTRT (SImode,
-                                                           operands[1],
-                                                           operands[2])),
-                            gen_rtx_CLOBBER (VOIDmode,
-                                             gen_rtx_SCRATCH (SImode)))));
-      DONE;
-    }
-}")
-
-(define_insn "*ashlsi3_insn"
-  [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
-       (ashift:SI (match_operand:SI 1 "nonmemory_operand" "r,r,I,J")
-                  (match_operand:SI 2 "nonmemory_operand" "rI,J,r,r")))]
-  "TARGET_SHIFTER"
-  "asl%? %0,%1,%2"
-  [(set_attr "type" "shift")
-   (set_attr "length" "1,2,1,2")])
-
-(define_insn "*ashrsi3_insn"
-  [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
-       (ashiftrt:SI (match_operand:SI 1 "nonmemory_operand" "r,r,I,J")
-                    (match_operand:SI 2 "nonmemory_operand" "rI,J,r,r")))]
-  "TARGET_SHIFTER"
-  "asr%? %0,%1,%2"
-  [(set_attr "type" "shift")
-   (set_attr "length" "1,2,1,2")])
-
-(define_insn "*lshrsi3_insn"
-  [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
-       (lshiftrt:SI (match_operand:SI 1 "nonmemory_operand" "r,r,I,J")
-                    (match_operand:SI 2 "nonmemory_operand" "rI,J,r,r")))]
-  "TARGET_SHIFTER"
-  "lsr%? %0,%1,%2"
-  [(set_attr "type" "shift")
-   (set_attr "length" "1,2,1,2")])
-
-(define_insn "*shift_si3"
-  [(set (match_operand:SI 0 "register_operand" "=r")
-       (match_operator:SI 3 "shift_operator"
-                          [(match_operand:SI 1 "register_operand" "0")
-                           (match_operand:SI 2 "nonmemory_operand" "rIJ")]))
-   (clobber (match_scratch:SI 4 "=&r"))]
-  "! TARGET_SHIFTER"
-  "* return output_shift (operands);"
-  [(set_attr "type" "shift")
-   (set_attr "length" "8")])
-\f
-;; Compare instructions.
-;; This controls RTL generation and register allocation.
-
-;; ??? We may be able to relax this a bit by adding a new constant 'K' for 0.
-;; This assumes sub.f 0,symbol,0 is a valid insn.
-;; Note that "sub.f 0,r0,1" is an 8 byte insn.  To avoid unnecessarily
-;; creating 8 byte insns we duplicate %1 in the destination reg of the insn
-;; if it's a small constant.
-
-(define_insn "*cmpsi_cc_insn"
-  [(set (reg:CC 61)
-       (compare:CC (match_operand:SI 0 "register_operand" "r,r,r")
-                   (match_operand:SI 1 "nonmemory_operand" "r,I,J")))]
-  ""
-  "@
-   sub.f 0,%0,%1
-   sub.f %1,%0,%1
-   sub.f 0,%0,%1"
-  [(set_attr "type" "compare,compare,compare")])
-
-(define_insn "*cmpsi_cczn_insn"
-  [(set (reg:CCZN 61)
-       (compare:CCZN (match_operand:SI 0 "register_operand" "r,r,r")
-                     (match_operand:SI 1 "nonmemory_operand" "r,I,J")))]
-  ""
-  "@
-   sub.f 0,%0,%1
-   sub.f %1,%0,%1
-   sub.f 0,%0,%1"
-  [(set_attr "type" "compare,compare,compare")])
-
-(define_insn "*cmpsi_ccznc_insn"
-  [(set (reg:CCZNC 61)
-       (compare:CCZNC (match_operand:SI 0 "register_operand" "r,r,r")
-                      (match_operand:SI 1 "nonmemory_operand" "r,I,J")))]
-  ""
-  "@
-   sub.f 0,%0,%1
-   sub.f %1,%0,%1
-   sub.f 0,%0,%1"
-  [(set_attr "type" "compare,compare,compare")])
-
-;; Next come the scc insn and its expander.
-
-(define_expand "cstoresi4"
-  [(set (match_dup 4)
-        (match_op_dup 5
-         [(match_operand:SI 2 "register_operand" "")
-          (match_operand:SI 3 "nonmemory_operand" "")]))
-   (set (match_operand:SI 0 "register_operand")
-        (match_operator:SI 1 "ordered_comparison_operator"
-        [(match_dup 4)
-         (const_int 0)]))]
-  ""
-  "
-{
-  operands[4] = gen_compare_reg (GET_CODE (operands[1]),
-                                operands[2], operands[3]);
-  operands[5] = gen_rtx_fmt_ee (COMPARE,
-                               GET_MODE (operands[4]),
-                               operands[2], operands[3]);
-}")
-
-(define_insn "*scc_insn"
-  [(set (match_operand:SI 0 "register_operand" "=r")
-       (match_operator:SI 1 "comparison_operator" [(reg 61) (const_int 0)]))]
-  ""
-  "mov %0,1\;sub.%D1 %0,%0,%0"
-  [(set_attr "type" "unary")
-   (set_attr "length" "2")])
-
-;; ??? Look up negscc insn.  See pa.md for example.
-(define_insn "*neg_scc_insn"
-  [(set (match_operand:SI 0 "register_operand" "=r")
-       (neg:SI (match_operator:SI 1 "comparison_operator"
-                [(reg 61) (const_int 0)])))]
-  ""
-  "mov %0,-1\;sub.%D1 %0,%0,%0"
-  [(set_attr "type" "unary")
-   (set_attr "length" "2")])
-
-(define_insn "*not_scc_insn"
-  [(set (match_operand:SI 0 "register_operand" "=r")
-       (not:SI (match_operator:SI 1 "comparison_operator"
-                [(reg 61) (const_int 0)])))]
-  ""
-  "mov %0,1\;sub.%d1 %0,%0,%0"
-  [(set_attr "type" "unary")
-   (set_attr "length" "2")])
-\f
-;; These control RTL generation for conditional jump insns
-
-(define_expand "cbranchsi4"
-  [(set (match_dup 4)
-        (match_op_dup 5
-        [(match_operand:SI 1 "register_operand" "")
-          (match_operand:SI 2 "nonmemory_operand" "")]))
-   (set (pc)
-        (if_then_else
-              (match_operator 0 "ordered_comparison_operator"
-              [(match_dup 4)
-               (const_int 0)])
-              (label_ref (match_operand 3 "" ""))
-              (pc)))]
-  ""
-  "
-{
-  operands[4] = gen_compare_reg (GET_CODE (operands[0]),
-                                operands[1], operands[2]);
-  operands[5] = gen_rtx_fmt_ee (COMPARE,
-                               GET_MODE (operands[4]),
-                               operands[1], operands[2]);
-}")
-
-;; Now match both normal and inverted jump.
-
-(define_insn "*branch_insn"
-  [(set (pc)
-       (if_then_else (match_operator 1 "proper_comparison_operator"
-                                     [(reg 61) (const_int 0)])
-                     (label_ref (match_operand 0 "" ""))
-                     (pc)))]
-  ""
-  "*
-{
-  if (arc_ccfsm_branch_deleted_p ())
-    {
-      arc_ccfsm_record_branch_deleted ();
-      return \"; branch deleted, next insns conditionalized\";
-    }
-  else
-    return \"%~b%d1%# %l0\";
-}"
-  [(set_attr "type" "branch")])
-
-(define_insn "*rev_branch_insn"
-  [(set (pc)
-       (if_then_else (match_operator 1 "proper_comparison_operator"
-                                     [(reg 61) (const_int 0)])
-                     (pc)
-                     (label_ref (match_operand 0 "" ""))))]
-  "REVERSIBLE_CC_MODE (GET_MODE (XEXP (operands[1], 0)))"
-  "*
-{
-  if (arc_ccfsm_branch_deleted_p ())
-    {
-      arc_ccfsm_record_branch_deleted ();
-      return \"; branch deleted, next insns conditionalized\";
-    }
-  else
-    return \"%~b%D1%# %l0\";
-}"
-  [(set_attr "type" "branch")])
-\f
-;; Unconditional and other jump instructions.
-
-(define_insn "jump"
-  [(set (pc) (label_ref (match_operand 0 "" "")))]
-  ""
-  "b%* %l0"
-  [(set_attr "type" "uncond_branch")])
-
-(define_insn "indirect_jump"
-  [(set (pc) (match_operand:SI 0 "address_operand" "p"))]
-  ""
-  "j%* %a0"
-  [(set_attr "type" "uncond_branch")])
-;; Implement a switch statement.
-;; This wouldn't be necessary in the non-pic case if we could distinguish
-;; label refs of the jump table from other label refs.  The problem is that
-;; label refs are output as "%st(.LL42)" but we don't want the %st - we want
-;; the real address since it's the address of the table.
-
-(define_expand "casesi"
-  [(set (match_dup 5)
-       (minus:SI (match_operand:SI 0 "register_operand" "")
-                 (match_operand:SI 1 "nonmemory_operand" "")))
-   (set (reg:CC 61)
-       (compare:CC (match_dup 5)
-                   (match_operand:SI 2 "nonmemory_operand" "")))
-   (set (pc)
-       (if_then_else (gtu (reg:CC 61)
-                          (const_int 0))
-                     (label_ref (match_operand 4 "" ""))
-                     (pc)))
-   (parallel
-    [(set (pc)
-         (mem:SI (plus:SI (mult:SI (match_dup 5)
-                                   (const_int 4))
-                          (label_ref (match_operand 3 "" "")))))
-     (clobber (match_scratch:SI 6 ""))
-     (clobber (match_scratch:SI 7 ""))])]
-  ""
-  "
-{
-  operands[5] = gen_reg_rtx (SImode);
-}")
-
-(define_insn "*casesi_insn"
-  [(set (pc)
-       (mem:SI (plus:SI (mult:SI (match_operand:SI 0 "register_operand" "r")
-                                 (const_int 4))
-                        (label_ref (match_operand 1 "" "")))))
-   (clobber (match_scratch:SI 2 "=r"))
-   (clobber (match_scratch:SI 3 "=r"))]
-  ""
-  "*
-{
-  output_asm_insn (\"mov %2,%1\", operands);
-  if (TARGET_SHIFTER)
-    output_asm_insn (\"asl %3,%0,2\", operands);
-  else
-    output_asm_insn (\"asl %3,%0\;asl %3,%3\", operands);
-  output_asm_insn (\"ld %2,[%2,%3]\", operands);
-  output_asm_insn (\"j.nd %a2\", operands);
-  return \"\";
-}"
-  [(set_attr "type" "uncond_branch")
-   (set_attr "length" "6")])
-
-(define_insn "tablejump"
-  [(set (pc) (match_operand:SI 0 "address_operand" "p"))
-   (use (label_ref (match_operand 1 "" "")))]
-  "0 /* disabled -> using casesi now */"
-  "j%* %a0"
-  [(set_attr "type" "uncond_branch")])
-
-(define_expand "call"
-  ;; operands[1] is stack_size_rtx
-  ;; operands[2] is next_arg_register
-  [(parallel [(call (match_operand:SI 0 "call_operand" "")
-                   (match_operand 1 "" ""))
-            (clobber (reg:SI 31))])]
-  ""
-  "")
-
-(define_insn "*call_via_reg"
-  [(call (mem:SI (match_operand:SI 0 "register_operand" "r"))
-        (match_operand 1 "" ""))
-   (clobber (reg:SI 31))]
-  ""
-  "lr blink,[status]\;j.d %0\;add blink,blink,2"
-  [(set_attr "type" "call_no_delay_slot")
-   (set_attr "length" "3")])
-
-(define_insn "*call_via_label"
-  [(call (mem:SI (match_operand:SI 0 "call_address_operand" ""))
-        (match_operand 1 "" ""))
-   (clobber (reg:SI 31))]
-  ""
-  ; The %~ is necessary in case this insn gets conditionalized and the previous
-  ; insn is the cc setter.
-  "%~bl%!%* %0"
-  [(set_attr "type" "call")
-   (set_attr "cond" "canuse")])
-
-(define_expand "call_value"
-  ;; operand 2 is stack_size_rtx
-  ;; operand 3 is next_arg_register
-  [(parallel [(set (match_operand 0 "register_operand" "=r")
-                  (call (match_operand:SI 1 "call_operand" "")
-                        (match_operand 2 "" "")))
-            (clobber (reg:SI 31))])]
-  ""
-  "")
-
-(define_insn "*call_value_via_reg"
-  [(set (match_operand 0 "register_operand" "=r")
-       (call (mem:SI (match_operand:SI 1 "register_operand" "r"))
-             (match_operand 2 "" "")))
-   (clobber (reg:SI 31))]
-  ""
-  "lr blink,[status]\;j.d %1\;add blink,blink,2"
-  [(set_attr "type" "call_no_delay_slot")
-   (set_attr "length" "3")])
-
-(define_insn "*call_value_via_label"
-  [(set (match_operand 0 "register_operand" "=r")
-       (call (mem:SI (match_operand:SI 1 "call_address_operand" ""))
-             (match_operand 2 "" "")))
-   (clobber (reg:SI 31))]
-  ""
-  ; The %~ is necessary in case this insn gets conditionalized and the previous
-  ; insn is the cc setter.
-  "%~bl%!%* %1"
-  [(set_attr "type" "call")
-   (set_attr "cond" "canuse")])
-\f
-(define_insn "nop"
-  [(const_int 0)]
-  ""
-  "nop"
-  [(set_attr "type" "misc")])
-
-;; Special pattern to flush the icache.
-;; ??? Not sure what to do here.  Some ARC's are known to support this.
-
-(define_insn "flush_icache"
-  [(unspec_volatile [(match_operand 0 "memory_operand" "m")] 0)]
-  ""
-  "* return \"\";"
-  [(set_attr "type" "misc")])
-\f
-;; Split up troublesome insns for better scheduling.
-\f
-;; Peepholes go at the end.
diff --git a/gcc/config/arc/arc.opt b/gcc/config/arc/arc.opt
deleted file mode 100644 (file)
index e5381f9..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-; Options for the Argonaut ARC port of the compiler
-;
-; Copyright (C) 2005, 2007, 2011 Free Software Foundation, 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 3, 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 COPYING3.  If not see
-; <http://www.gnu.org/licenses/>.
-
-EB
-Driver
-
-EL
-Driver
-
-malign-loops
-Target Undocumented Report Mask(ALIGN_LOOPS)
-
-mbig-endian
-Target Undocumented Report RejectNegative Mask(BIG_ENDIAN)
-
-mlittle-endian
-Target Undocumented Report RejectNegative InverseMask(BIG_ENDIAN)
-
-mmangle-cpu
-Target Report Mask(MANGLE_CPU)
-Prepend the name of the cpu to all public symbol names
-
-; mmangle-cpu-libgcc
-; Target Undocumented Mask(MANGLE_CPU_LIBGC)
-
-mno-cond-exec
-Target Undocumented Report RejectNegative Mask(NO_COND_EXEC)
-
-mcpu=
-Target RejectNegative Joined Var(arc_cpu_string) Init("base")
--mcpu=CPU      Compile code for ARC variant CPU
-
-mtext=
-Target RejectNegative Joined Var(arc_text_string) Init(ARC_DEFAULT_TEXT_SECTION)
--mtext=SECTION Put functions in SECTION
-
-mdata=
-Target RejectNegative Joined Var(arc_data_string) Init(ARC_DEFAULT_DATA_SECTION)
--mdata=SECTION Put data in SECTION
-
-mrodata=
-Target RejectNegative Joined Var(arc_rodata_string) Init(ARC_DEFAULT_RODATA_SECTION)
--mrodata=SECTION       Put read-only data in SECTION
diff --git a/gcc/config/arc/initfini.c b/gcc/config/arc/initfini.c
deleted file mode 100644 (file)
index d751413..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-/* .init/.fini section handling + C++ global constructor/destructor handling.
-   This file is based on crtstuff.c, sol2-crti.asm, sol2-crtn.asm.
-
-Copyright (C) 1995, 1997, 1998, 2009 Free Software Foundation, 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 3, 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.
-
-Under Section 7 of GPL version 3, you are granted additional
-permissions described in the GCC Runtime Library Exception, version
-3.1, as published by the Free Software Foundation.
-
-You should have received a copy of the GNU General Public License and
-a copy of the GCC Runtime Library Exception along with this program;
-see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-<http://www.gnu.org/licenses/>.  */
-
-/*  Declare a pointer to void function type.  */
-typedef void (*func_ptr) (void);
-
-#ifdef CRT_INIT
-
-/* NOTE:  In order to be able to support SVR4 shared libraries, we arrange
-   to have one set of symbols { __CTOR_LIST__, __DTOR_LIST__, __CTOR_END__,
-   __DTOR_END__ } per root executable and also one set of these symbols
-   per shared library.  So in any given whole process image, we may have
-   multiple definitions of each of these symbols.  In order to prevent
-   these definitions from conflicting with one another, and in order to
-   ensure that the proper lists are used for the initialization/finalization
-   of each individual shared library (respectively), we give these symbols
-   only internal (i.e. `static') linkage, and we also make it a point to
-   refer to only the __CTOR_END__ symbol in crtfini.o and the __DTOR_LIST__
-   symbol in crtinit.o, where they are defined.  */
-
-static func_ptr __CTOR_LIST__[1] __attribute__ ((section (".ctors")))
-     = { (func_ptr) (-1) };
-
-static func_ptr __DTOR_LIST__[1] __attribute__ ((section (".dtors")))
-     = { (func_ptr) (-1) };
-
-/* Run all the global destructors on exit from the program.  */
-/* Some systems place the number of pointers in the first word of the
-   table.  On SVR4 however, that word is -1.  In all cases, the table is
-   null-terminated.  On SVR4, we start from the beginning of the list and
-   invoke each per-compilation-unit destructor routine in order
-   until we find that null.
-
-   Note that this function MUST be static.  There will be one of these
-   functions in each root executable and one in each shared library, but
-   although they all have the same code, each one is unique in that it
-   refers to one particular associated `__DTOR_LIST__' which belongs to the
-   same particular root executable or shared library file.  */
-
-static void __do_global_dtors (void)
-asm ("__do_global_dtors") __attribute__ ((section (".text")));
-
-static void
-__do_global_dtors (void)
-{
-  func_ptr *p;
-  for (p = __DTOR_LIST__ + 1; *p; p++)
-    (*p) ();
-}
-
-/* .init section start.
-   This must appear at the start of the .init section.  */
-
-asm ("\n\
-       .section .init\n\
-       .global init\n\
-       .word 0\n\
-init:\n\
-       st blink,[sp,4]\n\
-       st fp,[sp]\n\
-       mov fp,sp\n\
-       sub sp,sp,16\n\
-");
-
-/* .fini section start.
-   This must appear at the start of the .init section.  */
-
-asm ("\n\
-       .section .fini\n\
-       .global fini\n\
-       .word 0\n\
-fini:\n\
-       st blink,[sp,4]\n\
-       st fp,[sp]\n\
-       mov fp,sp\n\
-       sub sp,sp,16\n\
-       bl.nd __do_global_dtors\n\
-");
-
-#endif /* CRT_INIT */
-
-#ifdef CRT_FINI
-
-/* Put a word containing zero at the end of each of our two lists of function
-   addresses.  Note that the words defined here go into the .ctors and .dtors
-   sections of the crtend.o file, and since that file is always linked in
-   last, these words naturally end up at the very ends of the two lists
-   contained in these two sections.  */
-
-static func_ptr __CTOR_END__[1] __attribute__ ((section (".ctors")))
-     = { (func_ptr) 0 };
-
-static func_ptr __DTOR_END__[1] __attribute__ ((section (".dtors")))
-     = { (func_ptr) 0 };
-
-/* Run all global constructors for the program.
-   Note that they are run in reverse order.  */
-
-static void __do_global_ctors (void)
-asm ("__do_global_ctors") __attribute__ ((section (".text")));
-
-static void
-__do_global_ctors (void)
-{
-  func_ptr *p;
-  for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--)
-    (*p) ();
-}
-
-/* .init section end.
-   This must live at the end of the .init section.  */
-
-asm ("\n\
-       .section .init\n\
-       bl.nd __do_global_ctors\n\
-       ld blink,[fp,4]\n\
-       j.d blink\n\
-       ld.a fp,[sp,16]\n\
-");
-
-/* .fini section end.
-   This must live at the end of the .fini section.  */
-
-asm ("\n\
-       .section .fini\n\
-       ld blink,[fp,4]\n\
-       j.d blink\n\
-       ld.a fp,[sp,16]\n\
-");
-
-#endif /* CRT_FINI */
diff --git a/gcc/config/arc/lib1funcs.asm b/gcc/config/arc/lib1funcs.asm
deleted file mode 100644 (file)
index c61f39a..0000000
+++ /dev/null
@@ -1,266 +0,0 @@
-; libgcc routines for ARC cpu.
-
-/* Copyright (C) 1995, 1997,2004, 2009 Free Software Foundation, Inc.
-
-This file 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 3, or (at your option) any
-later version.
-
-This file 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.
-
-Under Section 7 of GPL version 3, you are granted additional
-permissions described in the GCC Runtime Library Exception, version
-3.1, as published by the Free Software Foundation.
-
-You should have received a copy of the GNU General Public License and
-a copy of the GCC Runtime Library Exception along with this program;
-see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-<http://www.gnu.org/licenses/>.  */
-
-#ifdef  L_mulsi3
-       .section .text
-       .align 4
-
-#ifdef __base__
-       .cpu base
-       .global ___mulsi3
-___mulsi3:
-
-/* This the simple version.
-
-  while (a) 
-    {
-      if (a & 1)
-        r += b;
-      a >>= 1;
-      b <<= 1;
-    }
-*/
-       mov r2,0                ; Accumulate result here.
-.Lloop:
-       sub.f 0,r0,0            ; while (a)
-       nop
-       beq.nd .Ldone
-       and.f 0,r0,1            ; if (a & 1)
-       add.nz r2,r2,r1         ; r += b
-       lsr r0,r0               ; a >>= 1
-       b.d .Lloop
-       lsl r1,r1               ; b <<= 1
-.Ldone:
-       j.d blink
-       mov r0,r2
-#endif
-
-#endif /* L_mulsi3 */
-
-#ifdef  L_umulsidi3
-       .section .text
-       .align 4
-
-#ifdef __base__
-       .cpu base
-       .global ___umulsidi3
-___umulsidi3:
-
-/* This the simple version.
-
-  while (a) 
-    {
-      if (a & 1)
-        r += b;
-      a >>= 1;
-      b <<= 1;
-    }
-*/
-       mov r2,0                ; Top part of b.
-       mov r3,0                ; Accumulate result here.
-       mov r4,0
-.Lloop:
-       sub.f 0,r0,0            ; while (a)
-       nop
-       beq.nd .Ldone
-       and.f 0,r0,1            ; if (a & 1)
-       sub.f 0,r0,0
-       nop
-       beq .Ldontadd
-       add.f r4,r4,r1          ; r += b
-       adc   r3,r3,r2
-.Ldontadd:
-       lsr r0,r0               ; a >>= 1
-       lsl.f r1,r1             ; b <<= 1
-       b.d .Lloop
-       rlc r2,r2
-.Ldone:
-#ifdef __big_endian__
-       mov r1,r4
-       j.d blink
-       mov r0,r3
-#else
-       mov r0,r4
-       j.d blink
-       mov r1,r3
-#endif
-#endif
-
-#endif /* L_umulsidi3 */
-
-#ifdef L_divmod_tools
-
-; Utilities used by all routines.
-
-       .section .text
-       .align 4
-
-; inputs: r0 = numerator, r1 = denominator
-; outputs: positive r0/r1,
-;          r6.bit1 = sign of numerator, r6.bit0 = sign of result
-
-       .global ___divnorm
-___divnorm:
-       mov r6,0                ; keep sign in r6
-       sub.f 0,r0,0            ; is numerator -ve?
-       sub.lt r0,0,r0          ; negate numerator
-       mov.lt r6,3             ; sign is -ve
-       sub.f 0,r1,0            ; is denominator -ve?
-       sub.lt r1,0,r1          ; negate denominator
-       xor.lt r6,r6,1          ; toggle sign
-       j.nd blink
-
-/*
-unsigned long
-udivmodsi4(int modwanted, unsigned long num, unsigned long den)
-{
-  unsigned long bit = 1;
-  unsigned long res = 0;
-
-  while (den < num && bit && !(den & (1L<<31)))
-    {
-      den <<=1;
-      bit <<=1;
-    }
-  while (bit)
-    {
-      if (num >= den)
-       {
-         num -= den;
-         res |= bit;
-       }
-      bit >>=1;
-      den >>=1;
-    }
-  if (modwanted) return num;
-  return res;
-}
-*/
-
-; inputs: r0 = numerator, r1 = denominator
-; outputs: r0 = quotient, r1 = remainder, r2/r3 trashed
-
-       .global ___udivmodsi4
-___udivmodsi4:
-       mov r2,1                ; bit = 1
-       mov r3,0                ; res = 0
-.Lloop1:
-       sub.f 0,r1,r0           ; while (den < num
-       nop
-       bnc.nd .Lloop2
-       sub.f 0,r2,0            ; && bit
-       nop
-       bz.nd .Lloop2
-       lsl.f 0,r1              ; && !(den & (1<<31))
-       nop
-       bc.nd .Lloop2
-       lsl r1,r1               ; den <<= 1
-       b.d .Lloop1
-       lsl r2,r2               ; bit <<= 1
-.Lloop2:
-       sub.f 0,r2,0            ; while (bit)
-       nop
-       bz.nd .Ldivmodend
-       sub.f 0,r0,r1           ; if (num >= den)
-       nop
-       bc.nd .Lshiftdown
-       sub r0,r0,r1            ; num -= den
-       or r3,r3,r2             ; res |= bit
-.Lshiftdown:
-       lsr r2,r2               ; bit >>= 1
-       b.d .Lloop2
-       lsr r1,r1               ; den >>= 1
-.Ldivmodend:
-       mov r1,r0               ; r1 = mod
-       j.d blink
-       mov r0,r3               ; r0 = res
-
-#endif
-
-#ifdef  L_udivsi3
-       .section .text
-       .align 4
-
-#ifdef __base__
-       .cpu base
-       .global ___udivsi3
-___udivsi3:
-       mov r7,blink
-       bl.nd ___udivmodsi4
-       j.nd r7
-#endif
-
-#endif /* L_udivsi3 */
-
-#ifdef  L_divsi3
-       .section .text
-       .align 4
-
-#ifdef __base__
-       .cpu base
-       .global ___divsi3
-___divsi3:
-       mov r7,blink
-       bl.nd ___divnorm
-       bl.nd ___udivmodsi4
-       and.f 0,r6,1
-       sub.nz r0,0,r0          ; cannot go in delay slot, has limm value
-       j.nd r7
-#endif
-
-#endif /* L_divsi3 */
-
-#ifdef  L_umodsi3
-       .section .text
-       .align 4
-
-#ifdef __base__
-       .cpu base
-       .global ___umodsi3
-___umodsi3:
-       mov r7,blink
-       bl.nd ___udivmodsi4
-       j.d r7
-       mov r0,r1
-#endif
-
-#endif /* L_umodsi3 */
-
-#ifdef  L_modsi3
-       .section .text
-       .align 4
-
-#ifdef __base__
-       .cpu base
-       .global ___modsi3
-___modsi3:
-       mov r7,blink
-       bl.nd ___divnorm
-       bl.nd ___udivmodsi4
-       and.f 0,r6,2
-       sub.nz r1,0,r1
-       j.d r7
-       mov r0,r1
-#endif
-
-#endif /* L_modsi3 */
diff --git a/gcc/config/arc/t-arc b/gcc/config/arc/t-arc
deleted file mode 100644 (file)
index a923479..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright (C) 1997, 1998, 1999, 2001, 2002, 2003,
-# 2004 Free Software Foundation, 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 3, 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 COPYING3.  If not see
-# <http://www.gnu.org/licenses/>.
-
-LIB1ASMSRC = arc/lib1funcs.asm
-LIB1ASMFUNCS = _mulsi3 _umulsidi3 _udivsi3 _divsi3 _umodsi3 _modsi3 _divmod_tools
-
-# We need libgcc routines to be mangled according to which cpu they
-# were compiled for.
-# ??? -mmangle-cpu passed by default for now.
-#LIBGCC2_CFLAGS = -g1 -O2 $(LIBGCC2_INCLUDES) $(GCC_CFLAGS) -mmangle-cpu
-
-# We want fine grained libraries, so use the new code to build the
-# floating point emulation libraries.
-FPBIT = fp-bit.c
-DPBIT = dp-bit.c
-
-dp-bit.c: $(srcdir)/config/fp-bit.c
-       echo '#ifndef __big_endian__' > dp-bit.c
-       echo '#define FLOAT_BIT_ORDER_MISMATCH' >> dp-bit.c
-       echo '#endif' >> dp-bit.c
-       cat $(srcdir)/config/fp-bit.c >> dp-bit.c
-
-fp-bit.c: $(srcdir)/config/fp-bit.c
-       echo '#define FLOAT' > fp-bit.c
-       echo '#ifndef __big_endian__' >> fp-bit.c
-       echo '#define FLOAT_BIT_ORDER_MISMATCH' >> fp-bit.c
-       echo '#endif' >> fp-bit.c
-       cat $(srcdir)/config/fp-bit.c >> fp-bit.c
-
-# .init/.fini section routines
-
-$(T)crtinit.o: $(srcdir)/config/arc/initfini.c $(GCC_PASSES) $(CONFIG_H)
-       $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(CRTSTUFF_T_CFLAGS) \
-        $(MULTILIB_CFLAGS) -DCRT_INIT -finhibit-size-directive -fno-inline-functions \
-        -g0 -c $(srcdir)/config/arc/initfini.c -o $(T)crtinit.o
-
-$(T)crtfini.o: $(srcdir)/config/arc/initfini.c $(GCC_PASSES) $(CONFIG_H)
-       $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(CRTSTUFF_T_CFLAGS) \
-        -DCRT_FINI $(MULTILIB_CFLAGS) -finhibit-size-directive -fno-inline-functions \
-        -g0 -c $(srcdir)/config/arc/initfini.c -o $(T)crtfini.o
-
-MULTILIB_OPTIONS = EB
-MULTILIB_DIRNAMES = be
-EXTRA_MULTILIB_PARTS = crtinit.o crtfini.o
diff --git a/gcc/config/arm/netbsd.h b/gcc/config/arm/netbsd.h
deleted file mode 100644 (file)
index 4a1adba..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-/* NetBSD/arm a.out version.
-   Copyright (C) 1993, 1994, 1997, 1998, 2003, 2004, 2005, 2007, 2008, 2010
-   Free Software Foundation, Inc.
-   Contributed by Mark Brinicombe (amb@physig.ph.kcl.ac.uk)
-
-   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 3, 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 COPYING3.  If not see
-   <http://www.gnu.org/licenses/>.  */
-
-/* Run-time Target Specification.  */
-#undef  TARGET_VERSION
-#define TARGET_VERSION fputs (" (ARM/NetBSD)", stderr);
-
-/* Unsigned chars produces much better code than signed.  */
-#define DEFAULT_SIGNED_CHAR  0
-
-/* Since we always use GAS as our assembler we support stabs.  */
-#define DBX_DEBUGGING_INFO 1
-
-/*#undef ASM_DECLARE_FUNCTION_NAME*/
-
-/* ARM6 family default cpu.  */
-#define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6
-
-#undef TARGET_DEFAULT
-#define TARGET_DEFAULT (MASK_APCS_FRAME)
-
-/* Some defines for CPP.
-   arm32 is the NetBSD port name, so we always define arm32 and __arm32__.  */
-#define TARGET_OS_CPP_BUILTINS()               \
-    do {                                       \
-       NETBSD_OS_CPP_BUILTINS_AOUT();          \
-       builtin_define_std ("arm32");           \
-       builtin_define_std ("unix");            \
-       builtin_define_std ("riscbsd");         \
-    } while (0)
-
-#undef SUBTARGET_EXTRA_SPECS
-#define SUBTARGET_EXTRA_SPECS \
-  { "netbsd_cpp_spec",  NETBSD_CPP_SPEC }, \
-  { "netbsd_link_spec", NETBSD_LINK_SPEC_AOUT },
-
-#undef CPP_SPEC
-#define CPP_SPEC "\
-%(cpp_cpu_arch) %(cpp_float) %(cpp_endian) %(netbsd_cpp_spec) \
-"
-
-/* Because TARGET_DEFAULT sets MASK_SOFT_FLOAT */
-#undef CPP_FLOAT_DEFAULT_SPEC
-#define CPP_FLOAT_DEFAULT_SPEC "-D__SOFTFP__"
-
-/* Pass -X to the linker so that it will strip symbols starting with 'L' */
-#undef LINK_SPEC
-#define LINK_SPEC "-X %(netbsd_link_spec)"
-
-#undef SIZE_TYPE
-#define SIZE_TYPE "unsigned int"
-
-#undef PTRDIFF_TYPE
-#define PTRDIFF_TYPE "int"
-
-/* We don't have any limit on the length as out debugger is GDB.  */
-#undef DBX_CONTIN_LENGTH
-
-/* NetBSD does its profiling differently to the Acorn compiler. We
-   don't need a word following the mcount call; and to skip it
-   requires either an assembly stub or use of fomit-frame-pointer when
-   compiling the profiling functions.  Since we break Acorn CC
-   compatibility below a little more won't hurt.  */
-
-#undef  ARM_FUNCTION_PROFILER
-#define ARM_FUNCTION_PROFILER(STREAM,LABELNO)                                      \
-{                                                                          \
-  fprintf(STREAM, "\tmov\t%sip, %slr\n", REGISTER_PREFIX, REGISTER_PREFIX); \
-  fprintf(STREAM, "\tbl\tmcount\n");                                       \
-}
-
-/* On the ARM `@' introduces a comment, so we must use something else
-   for .type directives.  */
-#undef TYPE_OPERAND_FMT
-#define TYPE_OPERAND_FMT "%%%s"
-
-/* NetBSD uses the old PCC style aggregate returning conventions.  */
-#undef DEFAULT_PCC_STRUCT_RETURN
-#define DEFAULT_PCC_STRUCT_RETURN 1
-
-/* Although not normally relevant (since by default, all aggregates
-   are returned in memory) compiling some parts of libc requires
-   non-APCS style struct returns.  */
-#undef TARGET_RETURN_IN_MEMORY
-
-/* VERY BIG NOTE : Change of structure alignment for RiscBSD.
-   There are consequences you should be aware of...
-
-   Normally GCC/arm uses a structure alignment of 32 for compatibility
-   with armcc.  This means that structures are padded to a word
-   boundary.  However this causes problems with bugged NetBSD kernel
-   code (possibly userland code as well - I have not checked every
-   binary).  The nature of this bugged code is to rely on sizeof()
-   returning the correct size of various structures rounded to the
-   nearest byte (SCSI and ether code are two examples, the vm system
-   is another).  This code breaks when the structure alignment is 32
-   as sizeof() will report a word=rounded size.  By changing the
-   structure alignment to 8. GCC will conform to what is expected by
-   NetBSD.
-
-   This has several side effects that should be considered.
-   1. Structures will only be aligned to the size of the largest member.
-      i.e. structures containing only bytes will be byte aligned.
-           structures containing shorts will be half word aligned.
-           structures containing ints will be word aligned.
-
-      This means structures should be padded to a word boundary if
-      alignment of 32 is required for byte structures etc.
-      
-   2. A potential performance penalty may exist if strings are no longer
-      word aligned.  GCC will not be able to use word load/stores to copy
-      short strings.
-      
-   This modification is not encouraged but with the present state of the
-   NetBSD source tree it is currently the only solution that meets the
-   requirements.  */
-#undef  DEFAULT_STRUCTURE_SIZE_BOUNDARY
-#define DEFAULT_STRUCTURE_SIZE_BOUNDARY 8
-
-/* Clear the instruction cache from `BEG' to `END'.  This makes a
-   call to the ARM32_SYNC_ICACHE architecture specific syscall.  */
-#define CLEAR_INSN_CACHE(BEG, END)                                     \
-{                                                                      \
-  extern int sysarch(int number, void *args);                          \
-  struct {                                                             \
-    unsigned int  addr;                                                \
-    int           len;                                                 \
-  } s;                                                                 \
-  s.addr = (unsigned int)(BEG);                                        \
-  s.len = (END) - (BEG);                                               \
-  (void)sysarch(0, &s);                                                \
-}
diff --git a/gcc/config/arm/t-pe b/gcc/config/arm/t-pe
deleted file mode 100644 (file)
index 626b1d2..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006, 2008, 2009,
-# 2010
-# Free Software Foundation, 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 3, 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 COPYING3.  If not see
-# <http://www.gnu.org/licenses/>.
-
-LIB1ASMFUNCS += _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _call_via_rX _interwork_call_via_rX _clzsi2 _clzdi2
-
-# We want fine grained libraries, so use the new code to build the
-# floating point emulation libraries.
-FPBIT = fp-bit.c
-DPBIT = dp-bit.c
-
-fp-bit.c: $(srcdir)/config/fp-bit.c
-       echo '#define FLOAT' > fp-bit.c
-       echo '#ifndef __ARMEB__' >> fp-bit.c
-       echo '#define FLOAT_BIT_ORDER_MISMATCH' >> fp-bit.c
-       echo '#endif' >> fp-bit.c
-       cat $(srcdir)/config/fp-bit.c >> fp-bit.c
-
-dp-bit.c: $(srcdir)/config/fp-bit.c
-       echo '#ifndef __ARMEB__' > dp-bit.c
-       echo '#define FLOAT_BIT_ORDER_MISMATCH' >> dp-bit.c
-       echo '#define FLOAT_WORD_ORDER_MISMATCH' >> dp-bit.c
-       echo '#endif' >> dp-bit.c
-       cat $(srcdir)/config/fp-bit.c >> dp-bit.c
-
-pe.o: $(srcdir)/config/arm/pe.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
-  $(RTL_H) output.h flags.h $(TREE_H) expr.h $(TM_P_H)
-       $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
-               $(srcdir)/config/arm/pe.c
-
-MULTILIB_OPTIONS = mhard-float mthumb
-MULTILIB_DIRNAMES = fpu thumb
-
-LIBGCC = stmp-multilib
-INSTALL_LIBGCC = install-multilib
-TARGET_LIBGCC2_CFLAGS = 
diff --git a/gcc/config/crx/crx-protos.h b/gcc/config/crx/crx-protos.h
deleted file mode 100644 (file)
index aeb4bdd..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/* Prototypes for exported functions defined in crx.c
-   Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-   2002, 2003, 2004, 2007, 2010 Free Software Foundation, 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 3, 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 COPYING3.  If not see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_CRX_PROTOS_H
-#define GCC_CRX_PROTOS_H
-
-
-/* Register usage. */
-extern enum reg_class crx_regno_reg_class (int);
-extern int crx_hard_regno_mode_ok (int regno, enum machine_mode);
-#ifdef RTX_CODE
-extern enum reg_class crx_secondary_reload_class (enum reg_class, enum machine_mode, rtx);
-#endif /* RTX_CODE */
-
-/* Passing function arguments.  */
-extern int crx_function_arg_regno_p (int);
-#ifdef TREE_CODE
-#ifdef RTX_CODE
-extern void crx_init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx);
-#endif /* RTX_CODE */
-#endif /* TREE_CODE */
-
-#ifdef RTX_CODE
-/* Addressing Modes.  */
-struct crx_address
-{
-  rtx base, index, disp, side_effect;
-  int scale;
-};
-
-enum crx_addrtype
-{
-  CRX_INVALID, CRX_REG_REL, CRX_POST_INC, CRX_SCALED_INDX, CRX_ABSOLUTE
-};
-
-extern enum crx_addrtype crx_decompose_address (rtx addr, struct crx_address *out);
-
-extern int crx_const_double_ok (rtx op);
-
-/* Instruction output.  */
-extern void crx_print_operand (FILE *, rtx, int);
-extern void crx_print_operand_address (FILE *, rtx);
-
-/* Misc functions called from crx.md.  */
-extern void crx_expand_movmem_single (rtx, rtx, rtx, rtx, rtx, unsigned HOST_WIDE_INT *);
-extern int crx_expand_movmem (rtx, rtx, rtx, rtx);
-#endif /* RTX_CODE */
-
-/* Routines to compute costs.  */
-extern int crx_memory_move_cost (enum machine_mode, enum reg_class, int);
-
-/* Prologue/Epilogue functions.  */
-extern int crx_initial_elimination_offset (int, int);
-extern char *crx_prepare_push_pop_string (int);
-extern void crx_expand_prologue (void);
-extern void crx_expand_epilogue (void);
-
-
-/* Handling the "interrupt" attribute */
-extern int crx_interrupt_function_p (void);
-
-#endif /* GCC_CRX_PROTOS_H */
diff --git a/gcc/config/crx/crx.c b/gcc/config/crx/crx.c
deleted file mode 100644 (file)
index 8f635d5..0000000
+++ /dev/null
@@ -1,1466 +0,0 @@
-/* Output routines for GCC for CRX.
-   Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-   2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-   Free Software Foundation, 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 3, 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 COPYING3.  If not see
-   <http://www.gnu.org/licenses/>.  */
-
-/*****************************************************************************/
-/* HEADER INCLUDES                                                          */
-/*****************************************************************************/
-
-#include "config.h"
-#include "system.h"
-#include "coretypes.h"
-#include "tm.h"
-#include "rtl.h"
-#include "tree.h"
-#include "tm_p.h"
-#include "regs.h"
-#include "hard-reg-set.h"
-#include "insn-config.h"
-#include "conditions.h"
-#include "output.h"
-#include "insn-codes.h"
-#include "insn-attr.h"
-#include "flags.h"
-#include "except.h"
-#include "function.h"
-#include "recog.h"
-#include "expr.h"
-#include "optabs.h"
-#include "diagnostic-core.h"
-#include "basic-block.h"
-#include "df.h"
-#include "target.h"
-#include "target-def.h"
-
-/*****************************************************************************/
-/* DEFINITIONS                                                              */
-/*****************************************************************************/
-
-/* Maximum number of register used for passing parameters.  */
-#define MAX_REG_FOR_PASSING_ARGS 6
-
-/* Minimum number register used for passing parameters.  */
-#define MIN_REG_FOR_PASSING_ARGS 2
-
-/* The maximum count of words supported in the assembly of the architecture in
- * a push/pop instruction.  */
-#define MAX_COUNT              8
-
-/* Predicate is true if the current function is a 'noreturn' function, i.e. it
- * is qualified as volatile.  */
-#define FUNC_IS_NORETURN_P(decl) (TREE_THIS_VOLATILE (decl))
-
-/* The following macros are used in crx_decompose_address () */
-
-/* Returns the factor of a scaled index address or -1 if invalid. */
-#define SCALE_FOR_INDEX_P(X)   \
- (GET_CODE (X) == CONST_INT ?  \
-  (INTVAL (X) == 1 ? 1 :       \
-   INTVAL (X) == 2 ? 2 :       \
-   INTVAL (X) == 4 ? 4 :       \
-   INTVAL (X) == 8 ? 8 :       \
-   -1) :                       \
-  -1)
-
-/* Nonzero if the rtx X is a signed const int of n bits */
-#define RTX_SIGNED_INT_FITS_N_BITS(X,n)                        \
- ((GET_CODE (X) == CONST_INT                           \
-   && SIGNED_INT_FITS_N_BITS (INTVAL (X), n)) ? 1 : 0)
-
-/* Nonzero if the rtx X is an unsigned const int of n bits.  */
-#define RTX_UNSIGNED_INT_FITS_N_BITS(X, n)             \
- ((GET_CODE (X) == CONST_INT                           \
-   && UNSIGNED_INT_FITS_N_BITS (INTVAL (X), n)) ? 1 : 0)
-
-/*****************************************************************************/
-/* STATIC VARIABLES                                                         */
-/*****************************************************************************/
-
-/* Nonzero if the last param processed is passed in a register.  */
-static int last_parm_in_reg;
-
-/* Will hold the number of the last register the prologue saves, -1 if no
- * register is saved. */
-static int last_reg_to_save;
-
-/* Each object in the array is a register number. Mark 1 for registers that
- * need to be saved.  */
-static int save_regs[FIRST_PSEUDO_REGISTER];
-
-/* Number of bytes saved on the stack for non-scratch registers */
-static int sum_regs = 0;
-
-/* Number of bytes saved on the stack for local variables. */
-static int local_vars_size;
-
-/* The sum of 2 sizes: locals vars and padding byte for saving the registers.
- * Used in expand_prologue () and expand_epilogue ().  */
-static int size_for_adjusting_sp;
-
-/* In case of a POST_INC or POST_DEC memory reference, we must report the mode
- * of the memory reference from PRINT_OPERAND to PRINT_OPERAND_ADDRESS. */
-static enum machine_mode output_memory_reference_mode;
-
-/*****************************************************************************/
-/* TARGETM FUNCTION PROTOTYPES                                              */
-/*****************************************************************************/
-
-static bool crx_fixed_condition_code_regs (unsigned int *, unsigned int *);
-static rtx crx_struct_value_rtx (tree fntype ATTRIBUTE_UNUSED,
-                                int incoming ATTRIBUTE_UNUSED);
-static bool crx_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED);
-static int crx_address_cost (rtx, bool);
-static bool crx_legitimate_address_p (enum machine_mode, rtx, bool);
-static bool crx_can_eliminate (const int, const int);
-static rtx crx_function_arg (CUMULATIVE_ARGS *, enum machine_mode,
-                            const_tree, bool);
-static void crx_function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode,
-                                     const_tree, bool);
-
-/*****************************************************************************/
-/* RTL VALIDITY                                                                     */
-/*****************************************************************************/
-
-#undef TARGET_LEGITIMATE_ADDRESS_P
-#define TARGET_LEGITIMATE_ADDRESS_P    crx_legitimate_address_p
-
-#undef TARGET_CAN_ELIMINATE
-#define TARGET_CAN_ELIMINATE           crx_can_eliminate
-
-/*****************************************************************************/
-/* STACK LAYOUT AND CALLING CONVENTIONS                                             */
-/*****************************************************************************/
-
-#undef TARGET_FIXED_CONDITION_CODE_REGS
-#define        TARGET_FIXED_CONDITION_CODE_REGS crx_fixed_condition_code_regs
-
-#undef TARGET_STRUCT_VALUE_RTX
-#define        TARGET_STRUCT_VALUE_RTX         crx_struct_value_rtx
-
-#undef TARGET_RETURN_IN_MEMORY
-#define        TARGET_RETURN_IN_MEMORY         crx_return_in_memory
-
-/*****************************************************************************/
-/* PASSING FUNCTION ARGUMENTS                                               */
-/*****************************************************************************/
-
-#undef  TARGET_FUNCTION_ARG
-#define TARGET_FUNCTION_ARG            crx_function_arg
-
-#undef  TARGET_FUNCTION_ARG_ADVANCE
-#define TARGET_FUNCTION_ARG_ADVANCE    crx_function_arg_advance
-
-/*****************************************************************************/
-/* RELATIVE COSTS OF OPERATIONS                                                     */
-/*****************************************************************************/
-
-#undef TARGET_ADDRESS_COST
-#define        TARGET_ADDRESS_COST             crx_address_cost
-
-/*****************************************************************************/
-/* TARGET-SPECIFIC USES OF `__attribute__'                                  */
-/*****************************************************************************/
-
-#undef  TARGET_ATTRIBUTE_TABLE
-#define TARGET_ATTRIBUTE_TABLE         crx_attribute_table
-
-static const struct attribute_spec crx_attribute_table[] = {
-  /* ISRs have special prologue and epilogue requirements. */
-  {"interrupt", 0, 0, false, true, true, NULL, false},
-  {NULL, 0, 0, false, false, false, NULL, false}
-};
-
-/* Option handling.  */
-
-#undef TARGET_OPTION_OPTIMIZATION_TABLE
-#define        TARGET_OPTION_OPTIMIZATION_TABLE        crx_option_optimization_table
-
-static const struct default_options crx_option_optimization_table[] =
-  {
-    /* Put each function in its own section so that PAGE-instruction
-       relaxation can do its best.  */
-    { OPT_LEVELS_1_PLUS, OPT_ffunction_sections, NULL, 1 },
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
-/* Initialize 'targetm' variable which contains pointers to functions and data
- * relating to the target machine.  */
-
-struct gcc_target targetm = TARGET_INITIALIZER;
-
-
-/*****************************************************************************/
-/* TARGET HOOK IMPLEMENTATIONS                                              */
-/*****************************************************************************/
-
-/* Return the fixed registers used for condition codes.  */
-
-static bool
-crx_fixed_condition_code_regs (unsigned int *p1, unsigned int *p2)
-{
-    *p1 = CC_REGNUM;
-    *p2 = INVALID_REGNUM;
-    return true;
-}
-
-/* Implements hook TARGET_STRUCT_VALUE_RTX.  */
-
-static rtx
-crx_struct_value_rtx (tree fntype ATTRIBUTE_UNUSED,
-                     int incoming ATTRIBUTE_UNUSED)
-{
-  return gen_rtx_REG (Pmode, CRX_STRUCT_VALUE_REGNUM);
-}
-
-/* Implements hook TARGET_RETURN_IN_MEMORY.  */
-
-static bool
-crx_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
-{
-  if (TYPE_MODE (type) == BLKmode)
-    {
-      HOST_WIDE_INT size = int_size_in_bytes (type);
-      return (size == -1 || size > 8);
-    }
-  else
-    return false;
-}
-
-
-/*****************************************************************************/
-/* MACRO IMPLEMENTATIONS                                                    */
-/*****************************************************************************/
-
-/* STACK LAYOUT AND CALLING CONVENTIONS ROUTINES */
-/* --------------------------------------------- */
-
-/* Return nonzero if the current function being compiled is an interrupt
- * function as specified by the "interrupt" attribute.  */
-
-int
-crx_interrupt_function_p (void)
-{
-  tree attributes;
-
-  attributes = TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl));
-  return lookup_attribute ("interrupt", attributes) != NULL_TREE;
-}
-
-/* Compute values for the array save_regs and the variable sum_regs.  The index
- * of save_regs is numbers of register, each will get 1 if we need to save it
- * in the current function, 0 if not. sum_regs is the total sum of the
- * registers being saved. */
-
-static void
-crx_compute_save_regs (void)
-{
-  unsigned int regno;
-
-  /* initialize here so in case the function is no-return it will be -1. */
-  last_reg_to_save = -1;
-
-  /* No need to save any registers if the function never returns.  */
-  if (FUNC_IS_NORETURN_P (current_function_decl))
-    return;
-
-  /* Initialize the number of bytes to be saved. */
-  sum_regs = 0;
-
-  for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
-    {
-      if (fixed_regs[regno])
-       {
-         save_regs[regno] = 0;
-         continue;
-       }
-
-      /* If this reg is used and not call-used (except RA), save it. */
-      if (crx_interrupt_function_p ())
-       {
-         if (!current_function_is_leaf && call_used_regs[regno])
-           /* this is a volatile reg in a non-leaf interrupt routine - save it
-            * for the sake of its sons.  */
-           save_regs[regno] = 1;
-
-         else if (df_regs_ever_live_p (regno))
-           /* This reg is used - save it.  */
-           save_regs[regno] = 1;
-         else
-           /* This reg is not used, and is not a volatile - don't save. */
-           save_regs[regno] = 0;
-       }
-      else
-       {
-         /* If this reg is used and not call-used (except RA), save it. */
-         if (df_regs_ever_live_p (regno)
-             && (!call_used_regs[regno] || regno == RETURN_ADDRESS_REGNUM))
-           save_regs[regno] = 1;
-         else
-           save_regs[regno] = 0;
-       }
-    }
-
-  for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
-    if (save_regs[regno] == 1)
-      {
-       last_reg_to_save = regno;
-       sum_regs += UNITS_PER_WORD;
-      }
-}
-
-/* Compute the size of the local area and the size to be adjusted by the
- * prologue and epilogue. */
-
-static void
-crx_compute_frame (void)
-{
-  /* For aligning the local variables. */
-  int stack_alignment = STACK_BOUNDARY / BITS_PER_UNIT;
-  int padding_locals;
-
-  /* Padding needed for each element of the frame.  */
-  local_vars_size = get_frame_size ();
-
-  /* Align to the stack alignment. */
-  padding_locals = local_vars_size % stack_alignment;
-  if (padding_locals)
-    padding_locals = stack_alignment - padding_locals;
-
-  local_vars_size += padding_locals;
-
-  size_for_adjusting_sp = local_vars_size + (ACCUMULATE_OUTGOING_ARGS ?
-                                    crtl->outgoing_args_size : 0);
-}
-
-/* Worker function for TARGET_CAN_ELIMINATE.  */
-
-bool
-crx_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
-{
-  return (to == STACK_POINTER_REGNUM ? ! frame_pointer_needed : true);
-}
-
-/* Implements the macro INITIAL_ELIMINATION_OFFSET, return the OFFSET. */
-
-int
-crx_initial_elimination_offset (int from, int to)
-{
-  /* Compute this since we need to use sum_regs.  */
-  crx_compute_save_regs ();
-
-  /* Compute this since we need to use local_vars_size.  */
-  crx_compute_frame ();
-
-  if ((from) == FRAME_POINTER_REGNUM && (to) == STACK_POINTER_REGNUM)
-    return (ACCUMULATE_OUTGOING_ARGS ?
-           crtl->outgoing_args_size : 0);
-  else if ((from) == ARG_POINTER_REGNUM && (to) == FRAME_POINTER_REGNUM)
-    return (sum_regs + local_vars_size);
-  else if ((from) == ARG_POINTER_REGNUM && (to) == STACK_POINTER_REGNUM)
-    return (sum_regs + local_vars_size +
-           (ACCUMULATE_OUTGOING_ARGS ?
-            crtl->outgoing_args_size : 0));
-  else
-    abort ();
-}
-
-/* REGISTER USAGE */
-/* -------------- */
-
-/* Return the class number of the smallest class containing reg number REGNO.
- * This could be a conditional expression or could index an array. */
-
-enum reg_class
-crx_regno_reg_class (int regno)
-{
-  if (regno >= 0 && regno < SP_REGNUM)
-    return NOSP_REGS;
-
-  if (regno == SP_REGNUM)
-    return GENERAL_REGS;
-
-  if (regno == LO_REGNUM)
-    return LO_REGS;
-  if (regno == HI_REGNUM)
-    return HI_REGS;
-
-  return NO_REGS;
-}
-
-/* Transfer between HILO_REGS and memory via secondary reloading. */
-
-enum reg_class
-crx_secondary_reload_class (enum reg_class rclass,
-                           enum machine_mode mode ATTRIBUTE_UNUSED,
-                           rtx x ATTRIBUTE_UNUSED)
-{
-  if (reg_classes_intersect_p (rclass, HILO_REGS)
-      && true_regnum (x) == -1)
-    return GENERAL_REGS;
-
-  return NO_REGS;
-}
-
-/* Return 1 if hard register REGNO can hold a value of machine-mode MODE. */
-
-int
-crx_hard_regno_mode_ok (int regno, enum machine_mode mode)
-{
-  /* CC can only hold CCmode values.  */
-  if (regno == CC_REGNUM)
-    return GET_MODE_CLASS (mode) == MODE_CC;
-  if (GET_MODE_CLASS (mode) == MODE_CC)
-    return 0;
-  /* HILO registers can only hold SImode and DImode */
-  if (HILO_REGNO_P (regno))
-    return mode == SImode || mode == DImode;
-  return 1;
-}
-
-/* PASSING FUNCTION ARGUMENTS */
-/* -------------------------- */
-
-/* If enough param regs are available for passing the param of type TYPE return
- * the number of registers needed else 0.  */
-
-static int
-enough_regs_for_param (CUMULATIVE_ARGS * cum, const_tree type,
-                      enum machine_mode mode)
-{
-  int type_size;
-  int remaining_size;
-
-  if (mode != BLKmode)
-    type_size = GET_MODE_BITSIZE (mode);
-  else
-    type_size = int_size_in_bytes (type) * BITS_PER_UNIT;
-
-  remaining_size =
-    BITS_PER_WORD * (MAX_REG_FOR_PASSING_ARGS -
-    (MIN_REG_FOR_PASSING_ARGS + cum->ints) + 1);
-
-  /* Any variable which is too big to pass in two registers, will pass on
-   * stack. */
-  if ((remaining_size >= type_size) && (type_size <= 2 * BITS_PER_WORD))
-    return (type_size + BITS_PER_WORD - 1) / BITS_PER_WORD;
-
-  return 0;
-}
-
-/* Implements TARGET_FUNCTION_ARG.  */
-
-static rtx
-crx_function_arg (CUMULATIVE_ARGS * cum, enum machine_mode mode,
-                 const_tree type, bool named ATTRIBUTE_UNUSED)
-{
-  last_parm_in_reg = 0;
-
-  /* Function_arg () is called with this type just after all the args have had
-   * their registers assigned. The rtx that function_arg returns from this type
-   * is supposed to pass to 'gen_call' but currently it is not implemented (see
-   * macro GEN_CALL).  */
-  if (type == void_type_node)
-    return NULL_RTX;
-
-  if (targetm.calls.must_pass_in_stack (mode, type) || (cum->ints < 0))
-    return NULL_RTX;
-
-  if (mode == BLKmode)
-    {
-      /* Enable structures that need padding bytes at the end to pass to a
-       * function in registers. */
-      if (enough_regs_for_param (cum, type, mode) != 0)
-       {
-         last_parm_in_reg = 1;
-         return gen_rtx_REG (mode, MIN_REG_FOR_PASSING_ARGS + cum->ints);
-       }
-    }
-
-  if (MIN_REG_FOR_PASSING_ARGS + cum->ints > MAX_REG_FOR_PASSING_ARGS)
-    return NULL_RTX;
-  else
-    {
-      if (enough_regs_for_param (cum, type, mode) != 0)
-       {
-         last_parm_in_reg = 1;
-         return gen_rtx_REG (mode, MIN_REG_FOR_PASSING_ARGS + cum->ints);
-       }
-    }
-
-  return NULL_RTX;
-}
-
-/* Implements the macro INIT_CUMULATIVE_ARGS defined in crx.h.  */
-
-void
-crx_init_cumulative_args (CUMULATIVE_ARGS * cum, tree fntype,
-                     rtx libfunc ATTRIBUTE_UNUSED)
-{
-  tree param, next_param;
-
-  cum->ints = 0;
-
-  /* Determine if this function has variable arguments.  This is indicated by
-   * the last argument being 'void_type_mode' if there are no variable
-   * arguments.  Change here for a different vararg.  */
-  for (param = (fntype) ? TYPE_ARG_TYPES (fntype) : 0;
-       param != (tree) 0; param = next_param)
-    {
-      next_param = TREE_CHAIN (param);
-      if (next_param == (tree) 0 && TREE_VALUE (param) != void_type_node)
-       {
-         cum->ints = -1;
-         return;
-       }
-    }
-}
-
-/* Implements TARGET_FUNCTION_ARG_ADVANCE.  */
-
-static void
-crx_function_arg_advance (CUMULATIVE_ARGS * cum, enum machine_mode mode,
-                         const_tree type, bool named ATTRIBUTE_UNUSED)
-{
-  /* l holds the number of registers required */
-  int l = GET_MODE_BITSIZE (mode) / BITS_PER_WORD;
-
-  /* If the parameter isn't passed on a register don't advance cum.  */
-  if (!last_parm_in_reg)
-    return;
-
-  if (targetm.calls.must_pass_in_stack (mode, type) || (cum->ints < 0))
-    return;
-
-  if (mode == SImode || mode == HImode || mode == QImode || mode == DImode)
-    {
-      if (l <= 1)
-       cum->ints += 1;
-      else
-       cum->ints += l;
-    }
-  else if (mode == SFmode || mode == DFmode)
-    cum->ints += l;
-  else if ((mode) == BLKmode)
-    {
-      if ((l = enough_regs_for_param (cum, type, mode)) != 0)
-       cum->ints += l;
-    }
-
-}
-
-/* Implements the macro FUNCTION_ARG_REGNO_P defined in crx.h.  Return nonzero
- * if N is a register used for passing parameters.  */
-
-int
-crx_function_arg_regno_p (int n)
-{
-  return (n <= MAX_REG_FOR_PASSING_ARGS && n >= MIN_REG_FOR_PASSING_ARGS);
-}
-
-/* ADDRESSING MODES */
-/* ---------------- */
-
-/* Implements the hook for TARGET_LEGITIMATE_ADDRESS_P defined in crx.h.
- * The following addressing modes are supported on CRX:
- *
- * Relocations         --> const | symbol_ref | label_ref
- * Absolute address    --> 32-bit absolute
- * Post increment      --> reg + 12-bit disp.
- * Post modify         --> reg + 12-bit disp.
- * Register relative   --> reg | 32-bit disp. + reg | 4 bit + reg
- * Scaled index                --> reg + reg | 22-bit disp. + reg + reg |
- *                         22-disp. + reg + reg + (2 | 4 | 8) */
-
-static rtx
-crx_addr_reg (rtx addr_reg)
-{
-  if (GET_MODE (addr_reg) != Pmode)
-    return NULL_RTX;
-
-  if (REG_P (addr_reg))
-    return addr_reg;
-  else if (GET_CODE (addr_reg) == SUBREG
-          && REG_P (SUBREG_REG (addr_reg))
-          && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (addr_reg)))
-              <= UNITS_PER_WORD))
-    return SUBREG_REG (addr_reg);
-  else
-    return NULL_RTX;
-}
-
-enum crx_addrtype
-crx_decompose_address (rtx addr, struct crx_address *out)
-{
-  rtx base = NULL_RTX, index = NULL_RTX, disp = NULL_RTX;
-  rtx scale_rtx = NULL_RTX, side_effect = NULL_RTX;
-  int scale = -1;
-  
-  enum crx_addrtype retval = CRX_INVALID;
-
-  switch (GET_CODE (addr))
-    {
-    case CONST_INT:
-      /* Absolute address (known at compile time) */
-      retval = CRX_ABSOLUTE;
-      disp = addr;
-      if (!UNSIGNED_INT_FITS_N_BITS (INTVAL (disp), GET_MODE_BITSIZE (Pmode)))
-       return CRX_INVALID;
-      break;
-      
-    case CONST:
-    case SYMBOL_REF:
-    case LABEL_REF:
-      /* Absolute address (known at link time) */
-      retval = CRX_ABSOLUTE;
-      disp = addr;
-      break;
-
-    case REG:
-    case SUBREG:
-      /* Register relative address */
-      retval = CRX_REG_REL;
-      base = addr;
-      break;
-
-    case PLUS:
-      switch (GET_CODE (XEXP (addr, 0)))
-       {
-       case REG:
-       case SUBREG:
-         if (REG_P (XEXP (addr, 1)))
-           {
-             /* Scaled index with scale = 1 and disp. = 0 */
-             retval = CRX_SCALED_INDX;
-             base = XEXP (addr, 1);
-             index = XEXP (addr, 0); 
-             scale = 1;
-           }
-         else if (RTX_SIGNED_INT_FITS_N_BITS (XEXP (addr, 1), 28))
-           {
-             /* Register relative address and <= 28-bit disp. */
-             retval = CRX_REG_REL;
-             base = XEXP (addr, 0);
-             disp = XEXP (addr, 1);
-           }
-         else
-           return CRX_INVALID;
-         break;
-
-       case PLUS:
-         /* Scaled index and <= 22-bit disp. */
-         retval = CRX_SCALED_INDX;
-         base = XEXP (XEXP (addr, 0), 1); 
-         disp = XEXP (addr, 1);
-         if (!RTX_SIGNED_INT_FITS_N_BITS (disp, 22))
-           return CRX_INVALID;
-         switch (GET_CODE (XEXP (XEXP (addr, 0), 0)))
-           {
-           case REG:
-             /* Scaled index with scale = 0 and <= 22-bit disp. */
-             index = XEXP (XEXP (addr, 0), 0); 
-             scale = 1;
-             break;
-             
-           case MULT:
-             /* Scaled index with scale >= 0 and <= 22-bit disp. */
-             index = XEXP (XEXP (XEXP (addr, 0), 0), 0); 
-             scale_rtx = XEXP (XEXP (XEXP (addr, 0), 0), 1); 
-             if ((scale = SCALE_FOR_INDEX_P (scale_rtx)) == -1)
-               return CRX_INVALID;
-             break;
-
-           default:
-             return CRX_INVALID;
-           }
-         break;
-         
-       case MULT:
-         /* Scaled index with scale >= 0 */
-         retval = CRX_SCALED_INDX;
-         base = XEXP (addr, 1); 
-         index = XEXP (XEXP (addr, 0), 0); 
-         scale_rtx = XEXP (XEXP (addr, 0), 1); 
-         /* Scaled index with scale >= 0 and <= 22-bit disp. */
-         if ((scale = SCALE_FOR_INDEX_P (scale_rtx)) == -1)
-           return CRX_INVALID;
-         break;
-
-       default:
-         return CRX_INVALID;
-       }
-      break;
-
-    case POST_INC:
-    case POST_DEC:
-      /* Simple post-increment */
-      retval = CRX_POST_INC;
-      base = XEXP (addr, 0);
-      side_effect = addr;
-      break;
-
-    case POST_MODIFY:
-      /* Generic post-increment with <= 12-bit disp. */
-      retval = CRX_POST_INC;
-      base = XEXP (addr, 0);
-      side_effect = XEXP (addr, 1);
-      if (base != XEXP (side_effect, 0))
-       return CRX_INVALID;
-      switch (GET_CODE (side_effect))
-       {
-       case PLUS:
-       case MINUS:
-         disp = XEXP (side_effect, 1);
-         if (!RTX_SIGNED_INT_FITS_N_BITS (disp, 12))
-           return CRX_INVALID;
-         break;
-
-       default:
-         /* CRX only supports PLUS and MINUS */
-         return CRX_INVALID;
-       }
-      break;
-
-    default:
-      return CRX_INVALID;
-    }
-
-  if (base)
-    {
-      base = crx_addr_reg (base);
-      if (!base)
-       return CRX_INVALID;
-    }
-  if (index)
-    {
-      index = crx_addr_reg (index);
-      if (!index)
-       return CRX_INVALID;
-    }
-  
-  out->base = base;
-  out->index = index;
-  out->disp = disp;
-  out->scale = scale;
-  out->side_effect = side_effect;
-
-  return retval;
-}
-
-bool
-crx_legitimate_address_p (enum machine_mode mode ATTRIBUTE_UNUSED,
-                         rtx addr, bool strict)
-{
-  enum crx_addrtype addrtype;
-  struct crx_address address;
-                                                
-  if (TARGET_DEBUG_ADDR)
-    {
-      fprintf (stderr,
-               "\n======\nGO_IF_LEGITIMATE_ADDRESS, mode = %s, strict = %d\n",
-               GET_MODE_NAME (mode), strict);
-      debug_rtx (addr);
-    }
-  
-  addrtype = crx_decompose_address (addr, &address);
-
-  if (addrtype == CRX_POST_INC && GET_MODE_SIZE (mode) > UNITS_PER_WORD)
-    return FALSE;
-
-  if (TARGET_DEBUG_ADDR)
-    {
-      const char *typestr;
-      switch (addrtype)
-       {
-       case CRX_INVALID:
-         typestr = "Invalid";
-         break;
-       case CRX_REG_REL:
-         typestr = "Register relative";
-         break;
-       case CRX_POST_INC:
-         typestr = "Post-increment";
-         break;
-       case CRX_SCALED_INDX:
-         typestr = "Scaled index";
-         break;
-       case CRX_ABSOLUTE:
-         typestr = "Absolute";
-         break;
-       default:
-         abort ();
-       }
-      fprintf (stderr, "CRX Address type: %s\n", typestr);
-    }
-  
-  if (addrtype == CRX_INVALID)
-    return FALSE;
-
-  if (strict)
-    {
-      if (address.base && !REGNO_OK_FOR_BASE_P (REGNO (address.base)))
-       {
-         if (TARGET_DEBUG_ADDR)
-           fprintf (stderr, "Base register not strict\n");
-         return FALSE;
-       }
-      if (address.index && !REGNO_OK_FOR_INDEX_P (REGNO (address.index)))
-       {
-         if (TARGET_DEBUG_ADDR)
-           fprintf (stderr, "Index register not strict\n");
-         return FALSE;
-       }
-    }
-
-  return TRUE;
-}
-
-/* ROUTINES TO COMPUTE COSTS */
-/* ------------------------- */
-
-/* Return cost of the memory address x. */
-
-static int
-crx_address_cost (rtx addr, bool speed ATTRIBUTE_UNUSED)
-{
-  enum crx_addrtype addrtype;
-  struct crx_address address;
-                                                
-  int cost = 2;
-  
-  addrtype = crx_decompose_address (addr, &address);
-  
-  gcc_assert (addrtype != CRX_INVALID);
-
-  /* An absolute address causes a 3-word instruction */
-  if (addrtype == CRX_ABSOLUTE)
-    cost+=2;
-  
-  /* Post-modifying addresses are more powerful.  */
-  if (addrtype == CRX_POST_INC)
-    cost-=2;
-
-  /* Attempt to minimize number of registers in the address. */
-  if (address.base)
-    cost++;
-  
-  if (address.index && address.scale == 1)
-    cost+=5;
-
-  if (address.disp && !INT_CST4 (INTVAL (address.disp)))
-    cost+=2;
-
-  if (TARGET_DEBUG_ADDR)
-    {
-      fprintf (stderr, "\n======\nTARGET_ADDRESS_COST = %d\n", cost);
-      debug_rtx (addr);
-    }
-  
-  return cost;
-}
-
-/* Return the cost of moving data of mode MODE between a register of class
- * RCLASS and memory; IN is zero if the value is to be written to memory,
- * nonzero if it is to be read in. This cost is relative to those in
- * REGISTER_MOVE_COST.  */
-
-int
-crx_memory_move_cost (enum machine_mode mode,
-                 enum reg_class rclass ATTRIBUTE_UNUSED,
-                 int in ATTRIBUTE_UNUSED)
-{
-  /* One LD or ST takes twice the time of a simple reg-reg move */
-  if (reg_classes_intersect_p (rclass, GENERAL_REGS))
-    {
-      /* printf ("GENERAL_REGS LD/ST = %d\n", 4 * HARD_REGNO_NREGS (0, mode));*/
-      return 4 * HARD_REGNO_NREGS (0, mode);
-    }  
-  else if (reg_classes_intersect_p (rclass, HILO_REGS))
-    {
-      /* HILO to memory and vice versa */
-      /* printf ("HILO_REGS %s = %d\n", in ? "LD" : "ST",
-            (REGISTER_MOVE_COST (mode,
-                                in ? GENERAL_REGS : HILO_REGS,
-                                in ? HILO_REGS : GENERAL_REGS) + 4)
-       * HARD_REGNO_NREGS (0, mode)); */
-      return (REGISTER_MOVE_COST (mode,
-                                in ? GENERAL_REGS : HILO_REGS,
-                                in ? HILO_REGS : GENERAL_REGS) + 4)
-       * HARD_REGNO_NREGS (0, mode);
-    }
-  else /* default (like in i386) */
-    {
-      /* printf ("ANYREGS = 100\n"); */
-      return 100;
-    }
-}
-
-/* INSTRUCTION OUTPUT */
-/* ------------------ */
-
-/* Check if a const_double is ok for crx store-immediate instructions */
-
-int
-crx_const_double_ok (rtx op)
-{
-  if (GET_MODE (op) == DFmode)
-  {
-    REAL_VALUE_TYPE r;
-    long l[2];
-    REAL_VALUE_FROM_CONST_DOUBLE (r, op);
-    REAL_VALUE_TO_TARGET_DOUBLE (r, l);
-    return (UNSIGNED_INT_FITS_N_BITS (l[0], 4) &&
-           UNSIGNED_INT_FITS_N_BITS (l[1], 4)) ? 1 : 0;
-  }
-
-  if (GET_MODE (op) == SFmode)
-  {
-    REAL_VALUE_TYPE r;
-    long l;
-    REAL_VALUE_FROM_CONST_DOUBLE (r, op);
-    REAL_VALUE_TO_TARGET_SINGLE (r, l);
-    return UNSIGNED_INT_FITS_N_BITS (l, 4) ? 1 : 0;
-  }
-
-  return (UNSIGNED_INT_FITS_N_BITS (CONST_DOUBLE_LOW (op), 4) &&
-         UNSIGNED_INT_FITS_N_BITS (CONST_DOUBLE_HIGH (op), 4)) ? 1 : 0;
-}
-
-/* Implements the macro PRINT_OPERAND defined in crx.h.  */
-
-void
-crx_print_operand (FILE * file, rtx x, int code)
-{
-  switch (code)
-    {
-    case 'p' :
-      if (GET_CODE (x) == REG) {
-       if (GET_MODE (x) == DImode || GET_MODE (x) == DFmode)
-         {
-           int regno = REGNO (x);
-           if (regno + 1 >= SP_REGNUM) abort ();
-           fprintf (file, "{%s, %s}", reg_names[regno], reg_names[regno + 1]);
-           return;
-         }
-       else
-         {
-           if (REGNO (x) >= SP_REGNUM) abort ();
-           fprintf (file, "%s", reg_names[REGNO (x)]);
-           return;
-         }
-      }
-
-    case 'd' :
-       {
-         const char *crx_cmp_str;
-         switch (GET_CODE (x))
-           { /* MD: compare (reg, reg or imm) but CRX: cmp (reg or imm, reg)
-              * -> swap all non symmetric ops */
-           case EQ  : crx_cmp_str = "eq"; break;
-           case NE  : crx_cmp_str = "ne"; break;
-           case GT  : crx_cmp_str = "lt"; break;
-           case GTU : crx_cmp_str = "lo"; break;
-           case LT  : crx_cmp_str = "gt"; break;
-           case LTU : crx_cmp_str = "hi"; break;
-           case GE  : crx_cmp_str = "le"; break;
-           case GEU : crx_cmp_str = "ls"; break;
-           case LE  : crx_cmp_str = "ge"; break;
-           case LEU : crx_cmp_str = "hs"; break;
-           default : abort ();
-           }
-         fprintf (file, "%s", crx_cmp_str);
-         return;
-       }
-
-    case 'H':
-      /* Print high part of a double precision value. */
-      switch (GET_CODE (x))
-       {
-       case CONST_DOUBLE:
-         if (GET_MODE (x) == SFmode) abort ();
-         if (GET_MODE (x) == DFmode)
-           {
-             /* High part of a DF const. */
-             REAL_VALUE_TYPE r;
-             long l[2];
-
-             REAL_VALUE_FROM_CONST_DOUBLE (r, x);
-             REAL_VALUE_TO_TARGET_DOUBLE (r, l);
-
-             fprintf (file, "$0x%lx", l[1]);
-             return;
-           }
-
-         /* -- Fallthrough to handle DI consts -- */
-
-       case CONST_INT:
-           {
-             rtx high, low;
-             split_double (x, &low, &high);
-             putc ('$', file);
-             output_addr_const (file, high);
-             return;
-           }
-
-       case REG:
-         if (REGNO (x) + 1 >= FIRST_PSEUDO_REGISTER) abort ();
-         fprintf (file, "%s", reg_names[REGNO (x) + 1]);
-         return;
-
-       case MEM:
-         /* Adjust memory address to high part.  */
-           {
-             rtx adj_mem = x;
-             adj_mem = adjust_address (adj_mem, GET_MODE (adj_mem), 4);
-
-             output_memory_reference_mode = GET_MODE (adj_mem);
-             output_address (XEXP (adj_mem, 0));
-             return;
-           }
-
-       default:
-         abort ();
-       }
-
-    case 'L':
-      /* Print low part of a double precision value. */
-      switch (GET_CODE (x))
-       {
-       case CONST_DOUBLE:
-         if (GET_MODE (x) == SFmode) abort ();
-         if (GET_MODE (x) == DFmode)
-           {
-             /* High part of a DF const. */
-             REAL_VALUE_TYPE r;
-             long l[2];
-
-             REAL_VALUE_FROM_CONST_DOUBLE (r, x);
-             REAL_VALUE_TO_TARGET_DOUBLE (r, l);
-
-             fprintf (file, "$0x%lx", l[0]);
-             return;
-           }
-
-         /* -- Fallthrough to handle DI consts -- */
-
-       case CONST_INT:
-           {
-             rtx high, low;
-             split_double (x, &low, &high);
-             putc ('$', file);
-             output_addr_const (file, low);
-             return;
-           }
-
-       case REG:
-         fprintf (file, "%s", reg_names[REGNO (x)]);
-         return;
-
-       case MEM:
-         output_memory_reference_mode = GET_MODE (x);
-         output_address (XEXP (x, 0));
-         return;
-
-       default:
-         abort ();
-       }
-
-    case 0 : /* default */
-      switch (GET_CODE (x))
-       {
-       case REG:
-         fprintf (file, "%s", reg_names[REGNO (x)]);
-         return;
-
-       case MEM:
-         output_memory_reference_mode = GET_MODE (x);
-         output_address (XEXP (x, 0));
-         return;
-
-       case CONST_DOUBLE:
-           {
-             REAL_VALUE_TYPE r;
-             long l;
-
-             /* Always use H and L for double precision - see above */
-             gcc_assert (GET_MODE (x) == SFmode);
-
-             REAL_VALUE_FROM_CONST_DOUBLE (r, x);
-             REAL_VALUE_TO_TARGET_SINGLE (r, l);
-
-             fprintf (file, "$0x%lx", l);
-             return;
-           }
-
-       default:
-         putc ('$', file);
-         output_addr_const (file, x);
-         return;
-       }
-
-    default:
-      output_operand_lossage ("invalid %%xn code");
-    }
-
-  abort ();
-}
-
-/* Implements the macro PRINT_OPERAND_ADDRESS defined in crx.h.  */
-
-void
-crx_print_operand_address (FILE * file, rtx addr)
-{
-  enum crx_addrtype addrtype;
-  struct crx_address address;
-
-  int offset;
-  
-  addrtype = crx_decompose_address (addr, &address);
-  
-  if (address.disp)
-    offset = INTVAL (address.disp);
-  else
-    offset = 0;
-
-  switch (addrtype)
-    {
-    case CRX_REG_REL:
-      fprintf (file, "%d(%s)", offset, reg_names[REGNO (address.base)]);
-      return;
-      
-    case CRX_POST_INC:
-      switch (GET_CODE (address.side_effect))
-       {
-       case PLUS:
-         break;
-       case MINUS:
-         offset = -offset;
-         break;
-       case POST_INC:
-         offset = GET_MODE_SIZE (output_memory_reference_mode);
-         break;
-       case POST_DEC:
-         offset = -GET_MODE_SIZE (output_memory_reference_mode);
-         break;
-       default:
-         abort ();
-       }
-       fprintf (file, "%d(%s)+", offset, reg_names[REGNO (address.base)]);
-      return;
-      
-    case CRX_SCALED_INDX:
-      fprintf (file, "%d(%s, %s, %d)", offset, reg_names[REGNO (address.base)],
-              reg_names[REGNO (address.index)], address.scale);
-      return;
-      
-    case CRX_ABSOLUTE:
-      output_addr_const (file, address.disp);
-      return;
-      
-    default:
-      abort ();
-    }
-}
-
-
-/*****************************************************************************/
-/* MACHINE DESCRIPTION HELPER-FUNCTIONS                                             */
-/*****************************************************************************/
-
-void crx_expand_movmem_single (rtx src, rtx srcbase, rtx dst, rtx dstbase,
-                              rtx tmp_reg, unsigned HOST_WIDE_INT *offset_p)
-{
-  rtx addr, mem;
-  unsigned HOST_WIDE_INT offset = *offset_p;
-
-  /* Load */
-  addr = plus_constant (src, offset);
-  mem = adjust_automodify_address (srcbase, SImode, addr, offset);
-  emit_move_insn (tmp_reg, mem);
-
-  /* Store */
-  addr = plus_constant (dst, offset);
-  mem = adjust_automodify_address (dstbase, SImode, addr, offset);
-  emit_move_insn (mem, tmp_reg);
-
-  *offset_p = offset + 4;
-}
-
-int
-crx_expand_movmem (rtx dstbase, rtx srcbase, rtx count_exp, rtx align_exp)
-{
-  unsigned HOST_WIDE_INT count = 0, offset, si_moves, i;
-  HOST_WIDE_INT align = 0;
-
-  rtx src, dst;
-  rtx tmp_reg;
-
-  if (GET_CODE (align_exp) == CONST_INT)
-    { /* Only if aligned */
-      align = INTVAL (align_exp);
-      if (align & 3)
-       return 0;
-    }
-
-  if (GET_CODE (count_exp) == CONST_INT)
-    { /* No more than 16 SImode moves */
-      count = INTVAL (count_exp);
-      if (count > 64)
-       return 0;
-    }
-
-  tmp_reg = gen_reg_rtx (SImode);
-
-  /* Create psrs for the src and dest pointers */
-  dst = copy_to_mode_reg (Pmode, XEXP (dstbase, 0));
-  if (dst != XEXP (dstbase, 0))
-    dstbase = replace_equiv_address_nv (dstbase, dst);
-  src = copy_to_mode_reg (Pmode, XEXP (srcbase, 0));
-  if (src != XEXP (srcbase, 0))
-    srcbase = replace_equiv_address_nv (srcbase, src);
-
-  offset = 0;
-
-  /* Emit SImode moves */
-  si_moves = count >> 2;
-  for (i = 0; i < si_moves; i++)
-    crx_expand_movmem_single (src, srcbase, dst, dstbase, tmp_reg, &offset);
-
-  /* Special cases */
-  if (count & 3)
-    {
-      offset = count - 4;
-      crx_expand_movmem_single (src, srcbase, dst, dstbase, tmp_reg, &offset);
-    }
-
-  gcc_assert (offset == count);
-
-  return 1;
-}
-
-static void
-mpushpop_str (char *stringbuffer, const char *mnemonic, char *mask)
-{
-  if (strlen (mask) > 2 || crx_interrupt_function_p ()) /* needs 2-word instr. */
-    sprintf (stringbuffer, "\n\t%s\tsp, {%s}", mnemonic, mask);
-  else /* single word instruction */
-    sprintf (stringbuffer, "\n\t%s\t%s", mnemonic, mask);
-}
-
-/* Called from crx.md. The return value depends on the parameter push_or_pop:
- * When push_or_pop is zero -> string for push instructions of prologue.
- * When push_or_pop is nonzero -> string for pop/popret/retx in epilogue.
- * Relies on the assumptions:
- * 1. RA is the last register to be saved.
- * 2. The maximal value of the counter is MAX_COUNT. */
-
-char *
-crx_prepare_push_pop_string (int push_or_pop)
-{
-  /* j is the number of registers being saved, takes care that there won't be
-   * more than 8 in one push/pop instruction */
-
-  /* For the register mask string */
-  static char mask_str[50];
-
-  /* i is the index of save_regs[], going from 0 until last_reg_to_save */
-  int i = 0;
-
-  int ra_in_bitmask = 0;
-
-  char *return_str;
-
-  /* For reversing on the push instructions if there are more than one. */
-  char *temp_str;
-
-  return_str = (char *) xmalloc (120);
-  temp_str = (char *) xmalloc (120);
-
-  /* Initialize */
-  memset (return_str, 0, 3);
-
-  while (i <= last_reg_to_save)
-    {
-      /* Prepare mask for one instruction. */
-      mask_str[0] = 0;
-
-      if (i <= SP_REGNUM)
-       { /* Add regs unit full or SP register reached */
-         int j = 0;
-         while (j < MAX_COUNT && i <= SP_REGNUM)
-           {
-             if (save_regs[i])
-               {
-                 /* TODO to use ra_in_bitmask for detecting last pop is not
-                  * smart it prevents things like:  popret r5 */
-                 if (i == RETURN_ADDRESS_REGNUM) ra_in_bitmask = 1;
-                 if (j > 0) strcat (mask_str, ", ");
-                 strcat (mask_str, reg_names[i]);
-                 ++j;
-               }
-             ++i;
-           }
-       }
-      else
-       {
-         /* Handle hi/lo savings */
-         while (i <= last_reg_to_save)
-           {
-             if (save_regs[i])
-               {
-                 strcat (mask_str, "lo, hi");
-                 i = last_reg_to_save + 1;
-                 break;
-               }
-             ++i;
-           }
-       }
-
-      if (strlen (mask_str) == 0) continue;
-               
-      if (push_or_pop == 1)
-       {
-         if (crx_interrupt_function_p ())
-           mpushpop_str (temp_str, "popx", mask_str);
-         else
-           {
-             if (ra_in_bitmask)
-               {
-                 mpushpop_str (temp_str, "popret", mask_str);
-                 ra_in_bitmask = 0;
-               }
-             else mpushpop_str (temp_str, "pop", mask_str);
-           }
-
-         strcat (return_str, temp_str);
-       }
-      else
-       {
-         /* push - We need to reverse the order of the instructions if there
-          * are more than one. (since the pop will not be reversed in the
-          * epilogue */
-         if (crx_interrupt_function_p ())
-           mpushpop_str (temp_str, "pushx", mask_str);
-         else
-           mpushpop_str (temp_str, "push", mask_str);
-         strcat (temp_str, return_str);
-         strcpy (strcat (return_str, "\t"), temp_str);
-       }
-
-    }
-
-  if (push_or_pop == 1)
-    {
-      /* pop */
-      if (crx_interrupt_function_p ())
-       strcat (return_str, "\n\tretx\n");
-
-      else if (!FUNC_IS_NORETURN_P (current_function_decl)
-              && !save_regs[RETURN_ADDRESS_REGNUM])
-       strcat (return_str, "\n\tjump\tra\n");
-    }
-
-  /* Skip the newline and the tab in the start of return_str. */
-  return_str += 2;
-  return return_str;
-}
-
-/*  CompactRISC CRX Architecture stack layout:
-
-     0 +---------------------
-       |
-       .
-       .
-       |
-       +==================== Sp(x)=Ap(x+1)
-      A | Args for functions
-      | | called by X and      Dynamically
-      | | Dynamic allocations  allocated and
-      | | (alloca, variable    deallocated
-  Stack | length arrays).
-  grows +-------------------- Fp(x)
-  down| | Local variables of X
-  ward| +--------------------
-      | | Regs saved for X-1
-      | +==================== Sp(x-1)=Ap(x)
-       | Args for func X
-       | pushed by X-1
-       +-------------------- Fp(x-1)
-       |
-       |
-       V
-
-*/
-
-void
-crx_expand_prologue (void)
-{
-  crx_compute_frame ();
-  crx_compute_save_regs ();
-
-  /* If there is no need in push and adjustment to sp, return. */
-  if (size_for_adjusting_sp + sum_regs == 0)
-    return;
-
-  if (last_reg_to_save != -1)
-    /* If there are registers to push.  */
-    emit_insn (gen_push_for_prologue (GEN_INT (sum_regs)));
-
-  if (size_for_adjusting_sp > 0)
-    emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
-                          GEN_INT (-size_for_adjusting_sp)));
-
-  if (frame_pointer_needed)
-    /* Initialize the frame pointer with the value of the stack pointer
-     * pointing now to the locals. */
-    emit_move_insn (frame_pointer_rtx, stack_pointer_rtx);
-}
-
-/* Generate insn that updates the stack for local variables and padding for
- * registers we save. - Generate the appropriate return insn. */
-
-void
-crx_expand_epilogue (void)
-{
-  /* Nonzero if we need to return and pop only RA. This will generate a
-   * different insn. This differentiate is for the peepholes for call as last
-   * statement in function. */
-  int only_popret_RA = (save_regs[RETURN_ADDRESS_REGNUM]
-                       && (sum_regs == UNITS_PER_WORD));
-
-  if (frame_pointer_needed)
-    /* Restore the stack pointer with the frame pointers value */
-    emit_move_insn (stack_pointer_rtx, frame_pointer_rtx);
-
-  if (size_for_adjusting_sp > 0)
-    emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
-                          GEN_INT (size_for_adjusting_sp)));
-
-  if (crx_interrupt_function_p ())
-    emit_jump_insn (gen_interrupt_return ());
-  else if (last_reg_to_save == -1)
-    /* Nothing to pop */
-    /* Don't output jump for interrupt routine, only retx.  */
-    emit_jump_insn (gen_indirect_jump_return ());
-  else if (only_popret_RA)
-    emit_jump_insn (gen_popret_RA_return ());
-  else
-    emit_jump_insn (gen_pop_and_popret_return (GEN_INT (sum_regs)));
-}
diff --git a/gcc/config/crx/crx.h b/gcc/config/crx/crx.h
deleted file mode 100644 (file)
index da6e263..0000000
+++ /dev/null
@@ -1,478 +0,0 @@
-/* Definitions of target machine for GNU compiler, for CRX.
-   Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-   Free Software Foundation, 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 3, 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 COPYING3.  If not see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_CRX_H
-#define GCC_CRX_H
-
-/*****************************************************************************/
-/* CONTROLLING THE DRIVER                                                   */
-/*****************************************************************************/
-
-#define CC1PLUS_SPEC "%{!frtti:-fno-rtti} \
-    %{!fenforce-eh-specs:-fno-enforce-eh-specs} \
-    %{!fexceptions:-fno-exceptions} \
-    %{!fthreadsafe-statics:-fno-threadsafe-statics}"
-
-#undef  STARTFILE_SPEC
-#define STARTFILE_SPEC "crti.o%s crtbegin.o%s"
-
-#undef  ENDFILE_SPEC
-#define ENDFILE_SPEC "crtend.o%s crtn.o%s"
-
-#undef MATH_LIBRARY
-#define MATH_LIBRARY ""
-
-/*****************************************************************************/
-/* RUN-TIME TARGET SPECIFICATION                                            */
-/*****************************************************************************/
-
-#ifndef TARGET_CPU_CPP_BUILTINS
-#define TARGET_CPU_CPP_BUILTINS()                              \
-do {                                                           \
-     builtin_define("__CRX__");                                        \
-     builtin_define("__CR__");                                 \
-} while (0)
-#endif
-
-#define TARGET_VERSION fputs (" (CRX/ELF)", stderr);
-
-/*****************************************************************************/
-/* STORAGE LAYOUT                                                           */
-/*****************************************************************************/
-
-#define BITS_BIG_ENDIAN  0
-
-#define BYTES_BIG_ENDIAN 0
-
-#define WORDS_BIG_ENDIAN 0
-
-#define UNITS_PER_WORD 4
-
-#define POINTER_SIZE 32
-
-#define PARM_BOUNDARY 32
-
-#define STACK_BOUNDARY 32
-
-#define FUNCTION_BOUNDARY 32
-
-#define STRUCTURE_SIZE_BOUNDARY 32
-
-#define BIGGEST_ALIGNMENT 32
-
-/* In CRX arrays of chars are word-aligned, so strcpy() will be faster.  */
-#define DATA_ALIGNMENT(TYPE, ALIGN) \
-  (TREE_CODE (TYPE) == ARRAY_TYPE && TYPE_MODE (TREE_TYPE (TYPE)) == QImode \
-   && (ALIGN) < BITS_PER_WORD \
-   ? (BITS_PER_WORD) : (ALIGN))
-
-/* In CRX strings are word-aligned so strcpy from constants will be faster. */
-#define CONSTANT_ALIGNMENT(CONSTANT, ALIGN) \
-  (TREE_CODE (CONSTANT) == STRING_CST && (ALIGN) < BITS_PER_WORD \
-   ? (BITS_PER_WORD) : (ALIGN))
-
-#define STRICT_ALIGNMENT 0
-
-#define PCC_BITFIELD_TYPE_MATTERS 1
-
-/*****************************************************************************/
-/* LAYOUT OF SOURCE LANGUAGE DATA TYPES                                             */
-/*****************************************************************************/
-
-#define INT_TYPE_SIZE          32
-
-#define SHORT_TYPE_SIZE                16
-
-#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
-
-#define DEFAULT_SIGNED_CHAR    1
-
-#define SIZE_TYPE              "unsigned int"
-
-#define PTRDIFF_TYPE           "int"
-
-/*****************************************************************************/
-/* REGISTER USAGE.                                                          */
-/*****************************************************************************/
-
-#define FIRST_PSEUDO_REGISTER  19
-
-/* On the CRX, only the stack pointer (r15) is such. */
-#define FIXED_REGISTERS \
-  { \
- /* r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r10 */  \
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,     \
- /* r11 r12 r13 ra  sp  r16 r17 cc */              \
-    0,  0,  0,  0,  1,  0,  0,  1                  \
-  }
-
-/* On the CRX, calls clobbers r0-r6 (scratch registers), ra (the return address)
- * and sp - (the stack pointer which is fixed). */
-#define CALL_USED_REGISTERS \
-  { \
- /* r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r10 */  \
-    1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,     \
- /* r11 r12 r13 ra  sp  r16 r17 cc */              \
-    0,  0,  0,  1,  1,  1,  1,  1                  \
-  }
-
-#define HARD_REGNO_NREGS(REGNO, MODE) \
-    ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
-
-/* On the CRX architecture, HILO regs can only hold SI mode. */
-#define HARD_REGNO_MODE_OK(REGNO, MODE) crx_hard_regno_mode_ok(REGNO, MODE)
-
-/* So far no patterns for moving CCMODE data are available */
-#define AVOID_CCMODE_COPIES
-
-/* Interrupt functions can only use registers that have already been saved by
- * the prologue, even if they would normally be call-clobbered. */
-#define HARD_REGNO_RENAME_OK(SRC, DEST)        \
-  (!crx_interrupt_function_p () || df_regs_ever_live_p (DEST))
-
-#define MODES_TIEABLE_P(MODE1, MODE2)  1
-
-enum reg_class
-{
-  NO_REGS,
-  LO_REGS,
-  HI_REGS,
-  HILO_REGS,
-  NOSP_REGS,
-  GENERAL_REGS,
-  ALL_REGS,
-  LIM_REG_CLASSES
-};
-
-#define N_REG_CLASSES (int) LIM_REG_CLASSES
-
-/* The following macro defines cover classes for Integrated Register
-   Allocator.  Cover classes is a set of non-intersected register
-   classes covering all hard registers used for register allocation
-   purpose.  Any move between two registers of a cover class should be
-   cheaper than load or store of the registers.  The macro value is
-   array of register classes with LIM_REG_CLASSES used as the end
-   marker.  */
-
-#define IRA_COVER_CLASSES         \
-{                                 \
-   GENERAL_REGS, LIM_REG_CLASSES  \
-} 
-
-#define REG_CLASS_NAMES \
-  {                    \
-    "NO_REGS",         \
-    "LO_REGS",         \
-    "HI_REGS",         \
-    "HILO_REGS",       \
-    "NOSP_REGS",       \
-    "GENERAL_REGS",    \
-    "ALL_REGS"         \
-  }
-
-#define REG_CLASS_CONTENTS                             \
-  {                                                    \
-    {0x00000000}, /* NO_REGS                   */      \
-    {0x00010000}, /* LO_REGS :         16      */      \
-    {0x00020000}, /* HI_REGS :         17      */      \
-    {0x00030000}, /* HILO_REGS :       16, 17  */      \
-    {0x00007fff}, /* NOSP_REGS :       0 - 14  */      \
-    {0x0000ffff}, /* GENERAL_REGS :    0 - 15  */      \
-    {0x0007ffff}  /* ALL_REGS :        0 - 18  */      \
-  }
-
-#define REGNO_REG_CLASS(REGNO)  crx_regno_reg_class(REGNO)
-
-#define BASE_REG_CLASS         GENERAL_REGS
-
-#define INDEX_REG_CLASS                GENERAL_REGS
-
-#define REG_CLASS_FROM_LETTER(C)       \
-  ((C) == 'b' ? NOSP_REGS :            \
-   (C) == 'l' ? LO_REGS :              \
-   (C) == 'h' ? HI_REGS :              \
-   (C) == 'k' ? HILO_REGS :            \
-  NO_REGS)
-
-#define REGNO_OK_FOR_BASE_P(REGNO) \
-  ((REGNO) < 16 \
-   || (reg_renumber && (unsigned)reg_renumber[REGNO] < 16))
-
-#define REGNO_OK_FOR_INDEX_P(REGNO)       REGNO_OK_FOR_BASE_P(REGNO)
-
-#define SECONDARY_RELOAD_CLASS(CLASS, MODE, X) \
-  crx_secondary_reload_class (CLASS, MODE, X)
-
-#define CLASS_MAX_NREGS(CLASS, MODE) \
-    (GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD
-
-#define SIGNED_INT_FITS_N_BITS(imm, N) \
-  ((((imm) < ((long long)1<<((N)-1))) && ((imm) >= -((long long)1<<((N)-1)))) ? 1 : 0)
-
-#define UNSIGNED_INT_FITS_N_BITS(imm, N) \
-  (((imm) < ((long long)1<<(N)) && (imm) >= (long long)0) ? 1 : 0)
-
-#define HILO_REGNO_P(regno) \
-  (reg_classes_intersect_p(REGNO_REG_CLASS(regno), HILO_REGS))
-
-#define INT_CST4(VALUE) \
-  (((VALUE) >= -1 && (VALUE) <= 4) || (VALUE) == -4 \
-  || (VALUE) == 7 || (VALUE) == 8 || (VALUE) == 16 || (VALUE) == 32 \
-  || (VALUE) == 20 || (VALUE) == 12 || (VALUE) == 48)
-
-#define CONST_OK_FOR_LETTER_P(VALUE, C)                                \
-  /* Legal const for store immediate instructions */           \
-  ((C) == 'I' ? UNSIGNED_INT_FITS_N_BITS(VALUE, 3) :           \
-   (C) == 'J' ? UNSIGNED_INT_FITS_N_BITS(VALUE, 4) :           \
-   (C) == 'K' ? UNSIGNED_INT_FITS_N_BITS(VALUE, 5) :           \
-   (C) == 'L' ? INT_CST4(VALUE) :                              \
-  0)
-
-#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \
-  ((C) == 'G' ? crx_const_double_ok (VALUE) :  \
-  0)
-
-/*****************************************************************************/
-/* STACK LAYOUT AND CALLING CONVENTIONS.                                    */
-/*****************************************************************************/
-
-#define STACK_GROWS_DOWNWARD
-
-#define STARTING_FRAME_OFFSET  0
-
-#define        STACK_POINTER_REGNUM    15
-
-#define        FRAME_POINTER_REGNUM    13
-
-#define        ARG_POINTER_REGNUM      12
-
-#define STATIC_CHAIN_REGNUM    1
-
-#define        RETURN_ADDRESS_REGNUM   14
-
-#define FIRST_PARM_OFFSET(FNDECL)  0
-
-#define ELIMINABLE_REGS \
-  { \
-    { ARG_POINTER_REGNUM,   STACK_POINTER_REGNUM}, \
-    { ARG_POINTER_REGNUM,   FRAME_POINTER_REGNUM}, \
-    { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}  \
-  }
-
-#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET)                   \
-  do {                                                                 \
-    (OFFSET) = crx_initial_elimination_offset ((FROM), (TO));          \
-  } while (0)
-
-/*****************************************************************************/
-/* PASSING FUNCTION ARGUMENTS                                               */
-/*****************************************************************************/
-
-#define ACCUMULATE_OUTGOING_ARGS (TARGET_NO_PUSH_ARGS)
-
-#define PUSH_ARGS (!TARGET_NO_PUSH_ARGS)
-
-#define PUSH_ROUNDING(BYTES) (((BYTES) + 3) & ~3)
-
-#ifndef CUMULATIVE_ARGS
-struct cumulative_args
-{
-  int ints;
-};
-
-#define CUMULATIVE_ARGS struct cumulative_args
-#endif
-
-/* On the CRX architecture, Varargs routines should receive their parameters on
- * the stack.  */
-
-#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \
-  crx_init_cumulative_args(&(CUM), (FNTYPE), (LIBNAME))
-
-#define FUNCTION_ARG_REGNO_P(REGNO)  crx_function_arg_regno_p(REGNO)
-
-/*****************************************************************************/
-/* RETURNING FUNCTION VALUE                                                 */
-/*****************************************************************************/
-
-/* On the CRX, the return value is in R0 */
-
-#define FUNCTION_VALUE(VALTYPE, FUNC) \
-       gen_rtx_REG(TYPE_MODE (VALTYPE), 0)
-
-#define LIBCALL_VALUE(MODE)    gen_rtx_REG (MODE, 0)
-
-#define FUNCTION_VALUE_REGNO_P(N)      ((N) == 0)
-
-#define CRX_STRUCT_VALUE_REGNUM  0
-
-/*****************************************************************************/
-/* GENERATING CODE FOR PROFILING - NOT IMPLEMENTED                          */
-/*****************************************************************************/
-
-#undef  FUNCTION_PROFILER
-#define FUNCTION_PROFILER(STREAM, LABELNO)     \
-{                                              \
-    sorry ("profiler support for CRX");                \
-}
-       
-/*****************************************************************************/
-/* TRAMPOLINES FOR NESTED FUNCTIONS - NOT SUPPORTED                         */
-/*****************************************************************************/
-
-#define TRAMPOLINE_SIZE        32
-
-/*****************************************************************************/
-/* ADDRESSING MODES                                                         */
-/*****************************************************************************/
-
-#define CONSTANT_ADDRESS_P(X)                                          \
-  (GET_CODE (X) == LABEL_REF                                           \
-   || GET_CODE (X) == SYMBOL_REF                                       \
-   || GET_CODE (X) == CONST                                            \
-   || GET_CODE (X) == CONST_INT)
-
-#define MAX_REGS_PER_ADDRESS 2
-
-#define HAVE_POST_INCREMENT  1
-#define HAVE_POST_DECREMENT  1
-#define HAVE_POST_MODIFY_DISP 1
-#define HAVE_POST_MODIFY_REG 0
-
-#ifdef REG_OK_STRICT
-#define REG_OK_FOR_BASE_P(X)   REGNO_OK_FOR_BASE_P (REGNO (X))
-#define REG_OK_FOR_INDEX_P(X)  REGNO_OK_FOR_INDEX_P (REGNO (X))
-#else
-#define REG_OK_FOR_BASE_P(X)   1
-#define REG_OK_FOR_INDEX_P(X)  1
-#endif /* REG_OK_STRICT */
-
-#define LEGITIMATE_CONSTANT_P(X)  1
-
-/*****************************************************************************/
-/* CONDITION CODE STATUS                                                    */
-/*****************************************************************************/
-
-/*****************************************************************************/
-/* RELATIVE COSTS OF OPERATIONS                                                     */
-/*****************************************************************************/
-
-#define MEMORY_MOVE_COST(MODE, CLASS, IN) crx_memory_move_cost(MODE, CLASS, IN)
-/* Moving to processor register flushes pipeline - thus asymmetric */
-#define REGISTER_MOVE_COST(MODE, FROM, TO) ((TO != GENERAL_REGS) ? 8 : 2)
-/* Assume best case (branch predicted) */
-#define BRANCH_COST(speed_p, predictable_p) 2
-
-#define SLOW_BYTE_ACCESS  1
-
-/*****************************************************************************/
-/* DIVIDING THE OUTPUT INTO SECTIONS                                        */
-/*****************************************************************************/
-
-#define TEXT_SECTION_ASM_OP    "\t.section\t.text"
-
-#define DATA_SECTION_ASM_OP    "\t.section\t.data"
-
-#define BSS_SECTION_ASM_OP     "\t.section\t.bss"
-
-/*****************************************************************************/
-/* POSITION INDEPENDENT CODE                                                */
-/*****************************************************************************/
-
-#define PIC_OFFSET_TABLE_REGNUM  12
-
-#define LEGITIMATE_PIC_OPERAND_P(X)  1
-
-/*****************************************************************************/
-/* ASSEMBLER FORMAT                                                         */
-/*****************************************************************************/
-
-#define GLOBAL_ASM_OP "\t.globl\t"
-
-#undef USER_LABEL_PREFIX
-#define        USER_LABEL_PREFIX "_"
-
-#undef ASM_OUTPUT_LABELREF
-#define ASM_OUTPUT_LABELREF(STREAM, NAME) \
-  asm_fprintf (STREAM, "%U%s", (*targetm.strip_name_encoding) (NAME));
-
-#undef ASM_APP_ON
-#define ASM_APP_ON   "#APP\n"
-
-#undef ASM_APP_OFF
-#define ASM_APP_OFF  "#NO_APP\n"
-
-/*****************************************************************************/
-/* INSTRUCTION OUTPUT                                                       */
-/*****************************************************************************/
-
-#define REGISTER_NAMES \
-  { \
-    "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7", \
-    "r8",  "r9",  "r10", "r11", "r12", "r13", "ra",  "sp", \
-    "lo",  "hi",  "cc" \
-  }
-
-#define PRINT_OPERAND(STREAM, X, CODE) \
-  crx_print_operand(STREAM, X, CODE)
-
-#define PRINT_OPERAND_ADDRESS(STREAM, ADDR) \
-  crx_print_operand_address(STREAM, ADDR)
-
-/*****************************************************************************/
-/* OUTPUT OF DISPATCH TABLES                                                */
-/*****************************************************************************/
-
-#define ASM_OUTPUT_ADDR_VEC_ELT(STREAM, VALUE) \
-  asm_fprintf ((STREAM), "\t.long\t.L%d\n", (VALUE))
-
-/*****************************************************************************/
-/* ALIGNMENT IN ASSEMBLER FILE                                              */
-/*****************************************************************************/
-
-#define ASM_OUTPUT_ALIGN(STREAM, POWER) \
-  asm_fprintf ((STREAM), "\t.align\t%d\n", 1 << (POWER))
-
-/*****************************************************************************/
-/* MISCELLANEOUS PARAMETERS                                                 */
-/*****************************************************************************/
-
-#define CASE_VECTOR_MODE  Pmode
-
-#define MOVE_MAX 4
-
-#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC)  1
-
-#define STORE_FLAG_VALUE  1
-
-#define Pmode          SImode
-
-#define FUNCTION_MODE  QImode
-
-#endif /* ! GCC_CRX_H */
diff --git a/gcc/config/crx/crx.md b/gcc/config/crx/crx.md
deleted file mode 100644 (file)
index 229e345..0000000
+++ /dev/null
@@ -1,899 +0,0 @@
-;; GCC machine description for CRX.
-;; Copyright (C) 1988, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-;; 2001, 2002, 2003, 2004, 2007
-;; Free Software Foundation, 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 3, 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 COPYING3.  If not see
-;; <http://www.gnu.org/licenses/>.  */
-
-;;  Register numbers
-
-(define_constants
-  [(SP_REGNUM 15)      ; Stack pointer
-   (RA_REGNUM 14)      ; Return address
-   (LO_REGNUM 16)      ; LO register
-   (HI_REGNUM 17)      ; HI register
-   (CC_REGNUM 18)      ; Condition code register
-  ]
-)
-
-(define_attr "length" "" ( const_int 6 ))
-
-(define_asm_attributes
-  [(set_attr "length" "6")]
-)
-
-;;  Predicates
-
-(define_predicate "u4bits_operand"
-  (match_code "const_int,const_double")
-  {
-    if (GET_CODE (op) == CONST_DOUBLE)
-      return crx_const_double_ok (op);
-    return (UNSIGNED_INT_FITS_N_BITS(INTVAL(op), 4)) ? 1 : 0;
-  }
-)
-
-(define_predicate "cst4_operand"
-  (and (match_code "const_int")
-       (match_test "INT_CST4(INTVAL(op))")))
-
-(define_predicate "reg_or_u4bits_operand"
-  (ior (match_operand 0 "u4bits_operand")
-       (match_operand 0 "register_operand")))
-
-(define_predicate "reg_or_cst4_operand"
-  (ior (match_operand 0 "cst4_operand")
-       (match_operand 0 "register_operand")))
-
-(define_predicate "reg_or_sym_operand"
-  (ior (match_code "symbol_ref")
-       (match_operand 0 "register_operand")))
-
-(define_predicate "cc_reg_operand"
-  (and (match_code "reg")
-       (match_test "REGNO (op) == CC_REGNUM")))
-
-(define_predicate "nosp_reg_operand"
-  (and (match_operand 0 "register_operand")
-       (match_test "REGNO (op) != SP_REGNUM")))
-
-(define_predicate "store_operand"
-  (and (match_operand 0 "memory_operand")
-       (not (match_operand 0 "push_operand"))))
-
-;;  Mode Macro Definitions
-
-(define_mode_iterator ALLMT [QI HI SI SF DI DF])
-(define_mode_iterator CRXMM [QI HI SI SF])
-(define_mode_iterator CRXIM [QI HI SI])
-(define_mode_iterator DIDFM [DI DF])
-(define_mode_iterator SISFM [SI SF])
-(define_mode_iterator SHORT [QI HI])
-
-(define_mode_attr tIsa [(QI "b") (HI "w") (SI "d") (SF "d")])
-(define_mode_attr lImmArith [(QI "4") (HI "4") (SI "6")])
-(define_mode_attr lImmRotl [(QI "2") (HI "2") (SI "4")])
-(define_mode_attr IJK [(QI "I") (HI "J") (SI "K")])
-(define_mode_attr iF [(QI "i") (HI "i") (SI "i") (DI "i") (SF "F") (DF "F")])
-(define_mode_attr JG [(QI "J") (HI "J") (SI "J") (DI "J") (SF "G") (DF "G")])
-;   In HI or QI mode we push 4 bytes.
-(define_mode_attr pushCnstr [(QI "X") (HI "X") (SI "<") (SF "<") (DI "<") (DF "<")])
-(define_mode_attr tpush [(QI "") (HI "") (SI "") (SF "") (DI "sp, ") (DF "sp, ")])
-(define_mode_attr lpush [(QI "2") (HI "2") (SI "2") (SF "2") (DI "4") (DF "4")])
-
-
-;;  Code Macro Definitions
-
-(define_code_iterator sz_xtnd [sign_extend zero_extend])
-(define_code_attr sIsa [(sign_extend "") (zero_extend "u")])
-(define_code_attr sPat [(sign_extend "s") (zero_extend "u")])
-(define_code_attr szPat [(sign_extend "") (zero_extend "zero_")])
-(define_code_attr szIsa [(sign_extend "s") (zero_extend "z")])
-
-(define_code_iterator sh_oprnd [ashift ashiftrt lshiftrt])
-(define_code_attr shIsa [(ashift "ll") (ashiftrt "ra") (lshiftrt "rl")])
-(define_code_attr shPat [(ashift "ashl") (ashiftrt "ashr") (lshiftrt "lshr")])
-
-(define_code_iterator mima_oprnd [smax umax smin umin])
-(define_code_attr mimaIsa [(smax "maxs") (umax "maxu") (smin "mins") (umin "minu")])
-
-;;  Addition Instructions
-
-(define_insn "adddi3"
-  [(set (match_operand:DI 0 "register_operand" "=r,r")
-       (plus:DI (match_operand:DI 1 "register_operand" "%0,0")
-                (match_operand:DI 2 "nonmemory_operand" "r,i")))
-   (clobber (reg:CC CC_REGNUM))]
-  ""
-  "addd\t%L2, %L1\;addcd\t%H2, %H1"
-  [(set_attr "length" "4,12")]
-)
-
-(define_insn "add<mode>3"
-  [(set (match_operand:CRXIM 0 "register_operand" "=r,r")
-       (plus:CRXIM (match_operand:CRXIM 1 "register_operand" "%0,0")
-                   (match_operand:CRXIM 2 "nonmemory_operand" "r,i")))
-   (clobber (reg:CC CC_REGNUM))]
-  ""
-  "add<tIsa>\t%2, %0"
-  [(set_attr "length" "2,<lImmArith>")]
-)
-
-;;  Subtract Instructions
-
-(define_insn "subdi3"
-  [(set (match_operand:DI 0 "register_operand" "=r,r")
-       (minus:DI (match_operand:DI 1 "register_operand" "0,0")
-                 (match_operand:DI 2 "nonmemory_operand" "r,i")))
-   (clobber (reg:CC CC_REGNUM))]
-  ""
-  "subd\t%L2, %L1\;subcd\t%H2, %H1"
-  [(set_attr "length" "4,12")]
-)
-
-(define_insn "sub<mode>3"
-  [(set (match_operand:CRXIM 0 "register_operand" "=r,r")
-       (minus:CRXIM (match_operand:CRXIM 1 "register_operand" "0,0")
-                    (match_operand:CRXIM 2 "nonmemory_operand" "r,i")))
-   (clobber (reg:CC CC_REGNUM))]
-  ""
-  "sub<tIsa>\t%2, %0"
-  [(set_attr "length" "2,<lImmArith>")]
-)
-
-;;  Multiply Instructions
-
-(define_insn "mul<mode>3"
-  [(set (match_operand:CRXIM 0 "register_operand" "=r,r")
-       (mult:CRXIM (match_operand:CRXIM 1 "register_operand" "%0,0")
-                   (match_operand:CRXIM 2 "nonmemory_operand" "r,i")))
-   (clobber (reg:CC CC_REGNUM))]
-  ""
-  "mul<tIsa>\t%2, %0"
-  [(set_attr "length" "2,<lImmArith>")]
-)
-
-;;  Widening-multiplication Instructions
-
-(define_insn "<sIsa>mulsidi3"
-  [(set (match_operand:DI 0 "register_operand" "=k")
-       (mult:DI (sz_xtnd:DI (match_operand:SI 1 "register_operand" "%r"))
-                (sz_xtnd:DI (match_operand:SI 2 "register_operand" "r"))))
-   (clobber (reg:CC CC_REGNUM))]
-  ""
-  "mull<sPat>d\t%2, %1"
-  [(set_attr "length" "4")]
-)
-
-(define_insn "<sIsa>mulhisi3"
-  [(set (match_operand:SI 0 "register_operand" "=r")
-       (mult:SI (sz_xtnd:SI (match_operand:HI 1 "register_operand" "%0"))
-                (sz_xtnd:SI (match_operand:HI 2 "register_operand" "r"))))
-   (clobber (reg:CC CC_REGNUM))]
-  ""
-  "mul<sPat>wd\t%2, %0"
-  [(set_attr "length" "4")]
-)
-
-(define_insn "<sIsa>mulqihi3"
-  [(set (match_operand:HI 0 "register_operand" "=r")
-       (mult:HI (sz_xtnd:HI (match_operand:QI 1 "register_operand" "%0"))
-                (sz_xtnd:HI (match_operand:QI 2 "register_operand" "r"))))
-   (clobber (reg:CC CC_REGNUM))]
-  ""
-  "mul<sPat>bw\t%2, %0"
-  [(set_attr "length" "4")]
-)
-
-;;  Logical Instructions - and
-
-(define_insn "and<mode>3"
-  [(set (match_operand:CRXIM 0 "register_operand" "=r,r")
-       (and:CRXIM (match_operand:CRXIM 1 "register_operand" "%0,0")
-                  (match_operand:CRXIM 2 "nonmemory_operand" "r,i")))
-   (clobber (reg:CC CC_REGNUM))]
-  ""
-  "and<tIsa>\t%2, %0"
-  [(set_attr "length" "2,<lImmArith>")]
-)
-
-;;  Logical Instructions - or
-
-(define_insn "ior<mode>3"
-  [(set (match_operand:CRXIM 0 "register_operand" "=r,r")
-       (ior:CRXIM (match_operand:CRXIM 1 "register_operand" "%0,0")
-                  (match_operand:CRXIM 2 "nonmemory_operand" "r,i")))
-   (clobber (reg:CC CC_REGNUM))]
-  ""
-  "or<tIsa>\t%2, %0"
-  [(set_attr "length" "2,<lImmArith>")]
-)
-
-;;  Logical Instructions - xor
-
-(define_insn "xor<mode>3"
-  [(set (match_operand:CRXIM 0 "register_operand" "=r,r")
-       (xor:CRXIM (match_operand:CRXIM 1 "register_operand" "%0,0")
-                  (match_operand:CRXIM 2 "nonmemory_operand" "r,i")))
-   (clobber (reg:CC CC_REGNUM))]
-  ""
-  "xor<tIsa>\t%2, %0"
-  [(set_attr "length" "2,<lImmArith>")]
-)
-
-;;  Sign and Zero Extend Instructions
-
-(define_insn "<szPat>extendhisi2"
-  [(set (match_operand:SI 0 "register_operand" "=r")
-       (sz_xtnd:SI (match_operand:HI 1 "register_operand" "r")))
-   (clobber (reg:CC CC_REGNUM))]
-  ""
-  "<szIsa>extwd\t%1, %0"
-  [(set_attr "length" "4")]
-)
-
-(define_insn "<szPat>extendqisi2"
-  [(set (match_operand:SI 0 "register_operand" "=r")
-       (sz_xtnd:SI (match_operand:QI 1 "register_operand" "r")))
-   (clobber (reg:CC CC_REGNUM))]
-  ""
-  "<szIsa>extbd\t%1, %0"
-  [(set_attr "length" "4")]
-)
-
-(define_insn "<szPat>extendqihi2"
-  [(set (match_operand:HI 0 "register_operand" "=r")
-       (sz_xtnd:HI (match_operand:QI 1 "register_operand" "r")))
-   (clobber (reg:CC CC_REGNUM))]
-  ""
-  "<szIsa>extbw\t%1, %0"
-  [(set_attr "length" "4")]
-)
-
-;;  Negation Instructions
-
-(define_insn "neg<mode>2"
-  [(set (match_operand:CRXIM 0 "register_operand" "=r")
-       (neg:CRXIM (match_operand:CRXIM 1 "register_operand" "r")))
-   (clobber (reg:CC CC_REGNUM))]
-  ""
-  "neg<tIsa>\t%1, %0"
-  [(set_attr "length" "4")]
-)
-
-;;  Absolute Instructions
-
-(define_insn "abs<mode>2"
-  [(set (match_operand:CRXIM 0 "register_operand" "=r")
-       (abs:CRXIM (match_operand:CRXIM 1 "register_operand" "r")))
-   (clobber (reg:CC CC_REGNUM))]
-  ""
-  "abs<tIsa>\t%1, %0"
-  [(set_attr "length" "4")]
-)
-
-;;  Max and Min Instructions
-
-(define_insn "<code><mode>3"
-  [(set (match_operand:CRXIM 0 "register_operand" "=r")
-       (mima_oprnd:CRXIM (match_operand:CRXIM 1 "register_operand"  "%0")
-                         (match_operand:CRXIM 2 "register_operand"  "r")))]
-  ""
-  "<mimaIsa><tIsa>\t%2, %0"
-  [(set_attr "length" "4")]
-)
-
-;;  One's Complement
-
-(define_insn "one_cmpl<mode>2"
-  [(set (match_operand:CRXIM 0 "register_operand" "=r")
-       (not:CRXIM (match_operand:CRXIM 1 "register_operand" "0")))
-   (clobber (reg:CC CC_REGNUM))]
-  ""
-  "xor<tIsa>\t$-1, %0"
-  [(set_attr "length" "2")]
-)
-
-;;  Rotate Instructions
-
-(define_insn "rotl<mode>3"
-  [(set (match_operand:CRXIM 0 "register_operand" "=r,r")
-       (rotate:CRXIM (match_operand:CRXIM 1 "register_operand" "0,0")
-                     (match_operand:CRXIM 2 "nonmemory_operand" "r,<IJK>")))
-   (clobber (reg:CC CC_REGNUM))]
-  ""
-  "@
-  rotl<tIsa>\t%2, %0
-  rot<tIsa>\t%2, %0"
-  [(set_attr "length" "4,<lImmRotl>")]
-)
-
-(define_insn "rotr<mode>3"
-  [(set (match_operand:CRXIM 0 "register_operand" "=r")
-       (rotatert:CRXIM (match_operand:CRXIM 1 "register_operand" "0")
-                       (match_operand:CRXIM 2 "register_operand" "r")))
-   (clobber (reg:CC CC_REGNUM))]
-  ""
-  "rotr<tIsa>\t%2, %0"
-  [(set_attr "length" "4")]
-)
-
-;;  Arithmetic Left and Right Shift Instructions
-
-(define_insn "<shPat><mode>3"
-  [(set (match_operand:CRXIM 0 "register_operand" "=r,r")
-       (sh_oprnd:CRXIM (match_operand:CRXIM 1 "register_operand" "0,0")
-                       (match_operand:QI 2 "nonmemory_operand" "r,<IJK>")))
-   (clobber (reg:CC CC_REGNUM))]
-  ""
-  "s<shIsa><tIsa>\t%2, %0"
-  [(set_attr "length" "2,2")]
-)
-
-;;  Bit Set Instructions
-
-(define_insn "extv"
-  [(set (match_operand:SI 0 "register_operand" "=r")
-       (sign_extract:SI (match_operand:SI 1 "register_operand" "r")
-                        (match_operand:SI 2 "const_int_operand" "n")
-                        (match_operand:SI 3 "const_int_operand" "n")))]
-  ""
-  {
-    static char buf[100];
-    int strpntr;
-    int size = INTVAL (operands[2]);
-    int pos = INTVAL (operands[3]);
-    strpntr = sprintf (buf, "ram\t$%d, $31, $%d, %%1, %%0\;",
-             BITS_PER_WORD - (size + pos), BITS_PER_WORD - size);
-    sprintf (buf + strpntr, "srad\t$%d, %%0", BITS_PER_WORD - size);
-    return buf;
-  }
-  [(set_attr "length" "6")]
-)
-
-(define_insn "extzv"
-  [(set (match_operand:SI 0 "register_operand" "=r")
-       (zero_extract:SI (match_operand:SI 1 "register_operand" "r")
-                        (match_operand:SI 2 "const_int_operand" "n")
-                        (match_operand:SI 3 "const_int_operand" "n")))]
-  ""
-  {
-    static char buf[40];
-    int size = INTVAL (operands[2]);
-    int pos = INTVAL (operands[3]);
-    sprintf (buf, "ram\t$%d, $%d, $0, %%1, %%0",
-          (BITS_PER_WORD - pos) % BITS_PER_WORD, size - 1);
-    return buf;
-  }
-  [(set_attr "length" "4")]
-)
-
-(define_insn "insv"
-  [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r")
-                        (match_operand:SI 1 "const_int_operand" "n")
-                        (match_operand:SI 2 "const_int_operand" "n"))
-       (match_operand:SI 3 "register_operand" "r"))]
-  ""
-  {
-    static char buf[40];
-    int size = INTVAL (operands[1]);
-    int pos = INTVAL (operands[2]);
-    sprintf (buf, "rim\t$%d, $%d, $%d, %%3, %%0",
-           pos, size + pos - 1, pos);
-    return buf;
-  }
-  [(set_attr "length" "4")]
-)
-
-;;  Move Instructions
-
-(define_expand "mov<mode>"
-  [(set (match_operand:ALLMT 0 "nonimmediate_operand" "")
-       (match_operand:ALLMT 1 "general_operand" ""))]
-  ""
-  {
-    if (!(reload_in_progress || reload_completed))
-      {
-       if (!register_operand (operands[0], <MODE>mode))
-         {
-           if (push_operand (operands[0], <MODE>mode) ?
-               !nosp_reg_operand (operands[1], <MODE>mode) :
-               !reg_or_u4bits_operand (operands[1], <MODE>mode))
-             {
-               operands[1] = copy_to_mode_reg (<MODE>mode, operands[1]);
-             }
-         }
-      }
-  }
-)
-
-(define_insn "push<mode>_internal"
-  [(set (match_operand:ALLMT 0 "push_operand" "=<pushCnstr>")
-       (match_operand:ALLMT 1 "nosp_reg_operand" "b"))]
-  ""
-  "push\t<tpush>%p1"
-  [(set_attr "length" "<lpush>")]
-)
-
-(define_insn "mov<mode>_regs"
-  [(set (match_operand:SISFM 0 "register_operand" "=r, r, r, k")
-       (match_operand:SISFM 1 "nonmemory_operand" "r, <iF>, k, r"))]
-  ""
-  "@
-  movd\t%1, %0
-  movd\t%1, %0
-  mfpr\t%1, %0
-  mtpr\t%1, %0"
-  [(set_attr "length" "2,6,4,4")]
-)
-
-(define_insn "mov<mode>_regs"
-  [(set (match_operand:DIDFM 0 "register_operand" "=r, r, r, k")
-       (match_operand:DIDFM 1 "nonmemory_operand" "r, <iF>, k, r"))]
-  ""
-  {
-    switch (which_alternative)
-      {
-      case 0: if (REGNO (operands[0]) > REGNO (operands[1]))
-               return "movd\t%H1, %H0\;movd\t%L1, %L0";
-             else
-               return "movd\t%L1, %L0\;movd\t%H1, %H0";
-      case 1: return "movd\t%H1, %H0\;movd\t%L1, %L0";
-      case 2: return "mfpr\t%H1, %H0\;mfpr\t%L1, %L0";
-      case 3: return "mtpr\t%H1, %H0\;mtpr\t%L1, %L0";
-      default: gcc_unreachable ();
-      }
-  }
-  [(set_attr "length" "4,12,8,8")]
-)
-
-(define_insn "mov<mode>_regs" ; no HI/QI mode in HILO regs
-  [(set (match_operand:SHORT 0 "register_operand" "=r, r")
-       (match_operand:SHORT 1 "nonmemory_operand" "r, i"))]
-  ""
-  "mov<tIsa>\t%1, %0"
-  [(set_attr "length" "2,<lImmArith>")]
-)
-
-(define_insn "mov<mode>_load"
-  [(set (match_operand:CRXMM 0 "register_operand" "=r")
-       (match_operand:CRXMM 1 "memory_operand" "m"))]
-  ""
-  "load<tIsa>\t%1, %0"
-  [(set_attr "length" "6")]
-)
-
-(define_insn "mov<mode>_load"
-  [(set (match_operand:DIDFM 0 "register_operand" "=r")
-       (match_operand:DIDFM 1 "memory_operand" "m"))]
-  ""
-  {
-    rtx first_dest_reg = gen_rtx_REG (SImode, REGNO (operands[0]));
-    if (reg_overlap_mentioned_p (first_dest_reg, operands[1]))
-      return "loadd\t%H1, %H0\;loadd\t%L1, %L0";
-    return "loadd\t%L1, %L0\;loadd\t%H1, %H0";
-  }
-  [(set_attr "length" "12")]
-)
-
-(define_insn "mov<mode>_store"
-  [(set (match_operand:CRXMM 0 "store_operand" "=m, m")
-       (match_operand:CRXMM 1 "reg_or_u4bits_operand" "r, <JG>"))]
-  ""
-  "stor<tIsa>\t%1, %0"
-  [(set_attr "length" "6")]
-)
-
-(define_insn "mov<mode>_store"
-  [(set (match_operand:DIDFM 0 "store_operand" "=m, m")
-       (match_operand:DIDFM 1 "reg_or_u4bits_operand" "r, <JG>"))]
-  ""
-  "stord\t%H1, %H0\;stord\t%L1, %L0"
-  [(set_attr "length" "12")]
-)
-
-;;  Movmem Instruction
-
-(define_expand "movmemsi"
-  [(use (match_operand:BLK 0 "memory_operand" ""))
-   (use (match_operand:BLK 1 "memory_operand" ""))
-   (use (match_operand:SI 2 "nonmemory_operand" ""))
-   (use (match_operand:SI 3 "const_int_operand" ""))]
-  ""
-  {
-    if (crx_expand_movmem (o