* Claudiu Zissulescu <claudiu.zissule...@synopsys.com> [2016-10-10 15:26:47 
+0200]:

> Hi Andrew,
> 
> This is updated patch of the original sent to mailing list some while ago.
> 
> What is new:
>      - Do not use MULTILIB_REUSE as its semantic changed, and the old one was 
> causing issues while building.
>      - Update invoke.texi documentation adding nps400 option to mcpu.
> 
> This patch is important as it changes the way how we handle CPU
> variations and multilib support. It will be great if you can include
> this patch on your review list before any other one.

Sorry it's taken soooo long to review this patch.

In general I like this, and think it's a step in the right direction.
I have a few pretty minor concerns, but hopefully nothing too
contentious.

In general I like the use of the *.def files, but my only concern is
the lack of explanation in any of them about what they're for.  It
would be nice if each had a summary of what each field represents to
make it easier to add new entries.

The use of arc_seen_options can, I think be replaced by using
global_opts_seen.x_target_flags, or maybe there's a detail I'm not
understanding, in which case maybe a comment somewhere to explain why
those two things are different.

The only thing I dislike in this patch is the switch from 'arc_cpu' to
a set of global boolean flags.  I can't see why we'd ever want more
than one of those architecture flags to be true, so I'd rather we
switched back to an enum if that's possible.

[ I've left my review comments in line below too, but the above is a
summary of everything, there's nothing additional below. ]

Thanks,
Andrew

> 
> Thanks,
> Claudiu
> 
> gcc/
> 2016-05-09  Claudiu Zissulescu  <claz...@synopsys.com>
> 
>       * config/arc/arc-arch.h: New file.
>       * config/arc/arc-arches.def: Likewise.
>       * config/arc/arc-cpus.def: Likewise.
>       * config/arc/arc-options.def: Likewise.
>       * config/arc/t-multilib: Likewise.
>       * config/arc/genmultilib.awk: Likewise.
>       * config/arc/genoptions.awk: Likewise.
>       * config/arc/arc-tables.opt: Likewise.
>       * config/arc/driver-arc.c: Likewise.
>       * common/config/arc/arc-common.c (arc_handle_option): Trace
>       toggled options.
>       * config.gcc (arc*-*-*): Add arc-tables.opt to arc's extra
>       options; check for supported cpu against arc-cpus.def file.
>       (arc*-*-elf*, arc*-*-linux-uclibc*): Use new make fragment; define
>       TARGET_CPU_BUILD macro; add driver-arc.o as an extra object.
>       * config/arc/arc-c.def: Add emacs local variables.
>       * config/arc/arc-opts.h (processor_type): Use arc-cpus.def file.
>       (FPU_FPUS, FPU_FPUD, FPU_FPUDA, FPU_FPUDA_DIV, FPU_FPUDA_FMA)
>       (FPU_FPUDA_ALL, FPU_FPUS_DIV, FPU_FPUS_FMA, FPU_FPUS_ALL)
>       (FPU_FPUD_DIV, FPU_FPUD_FMA, FPU_FPUD_ALL): New defines.
>       (DEFAULT_arc_fpu_build): Define.
>       (DEFAULT_arc_mpy_option): Define.
>       * config/arc/arc-protos.h (arc_init): Delete.
>       * config/arc/arc.c (arc_cpu_name): New variable.
>       (arc_selected_cpu, arc_selected_arch, arc_arcem, arc_archs)
>       (arc_arc700, arc_arc600, arc_arc601): New variable.
>       (arc_init): Add static; remove selection of default tune value,
>       cleanup obsolete error messages.
>       (arc_override_options): Make use of .def files for selecting the
>       right cpu and option configurations.
>       * config/arc/arc.h (stdbool.h): Include.
>       (TARGET_CPU_DEFAULT): Define.
>       (CPP_SPEC): Remove mcpu=NPS400 handling.
>       (arc_cpu_to_as): Declare.
>       (EXTRA_SPEC_FUNCTIONS): Define.
>       (OPTION_DEFAULT_SPECS): Likewise.
>       (ASM_DEFAULT): Remove.
>       (ASM_SPEC): Use arc_cpu_to_as.
>       (DRIVER_SELF_SPECS): Remove deprecated options.
>       (arc_arc700, arc_arc600, arc_arc601, arc_arcem, arc_archs):
>       Declare.
>       (TARGET_ARC600, TARGET_ARC601, TARGET_ARC700, TARGET_EM)
>       (TARGET_HS, TARGET_V2, TARGET_ARC600): Make them use arc_arc*
>       variables.
>       (MULTILIB_DEFAULTS): Use ARC_MULTILIB_CPU_DEFAULT.
>       * config/arc/arc.md (attr_cpu): Remove.
>       * config/arc/arc.opt (arc_mpy_option): Make it target variable.
>       (mno-mpy): Deprecate.
>       (mcpu=ARC600, mcpu=ARC601, mcpu=ARC700, mcpu=NPS400, mcpu=ARCEM)
>       (mcpu=ARCHS): Remove.
>       (mcrc, mdsp-packa, mdvbf, mmac-d16, mmac-24, mtelephony, mrtsc):
>       Deprecate.
>       (mbarrel_shifte, mspfp_, mdpfp_, mdsp_pack, mmac_): Remove.
>       (arc_fpu): Use new defines.
>       (arc_seen_options): New target variable.
>       * config/arc/t-arc (driver-arc.o): New target.
>       (arc-cpus, t-multilib, arc-tables.opt): Likewise.
>       * config/arc/t-arc-newlib: Delete.
>       * config/arc/t-arc-uClibc: Renamed to t-uClibc.
>       * doc/invoke.texi (ARC): Update arc options.
> ---
>  gcc/common/config/arc/arc-common.c | 162 ++++++++++++++++++++---------
>  gcc/config.gcc                     |  47 +++++----
>  gcc/config/arc/arc-arch.h          | 120 ++++++++++++++++++++++
>  gcc/config/arc/arc-arches.def      |  35 +++++++
>  gcc/config/arc/arc-c.def           |   4 +
>  gcc/config/arc/arc-cpus.def        |  47 +++++++++
>  gcc/config/arc/arc-options.def     |  69 +++++++++++++
>  gcc/config/arc/arc-opts.h          |  47 +++++++--
>  gcc/config/arc/arc-protos.h        |   1 -
>  gcc/config/arc/arc-tables.opt      |  90 ++++++++++++++++
>  gcc/config/arc/arc.c               | 186 ++++++++++++++++++---------------
>  gcc/config/arc/arc.h               |  91 ++++++++---------
>  gcc/config/arc/arc.md              |   5 -
>  gcc/config/arc/arc.opt             | 109 ++++++--------------
>  gcc/config/arc/driver-arc.c        |  80 +++++++++++++++
>  gcc/config/arc/genmultilib.awk     | 203 
> +++++++++++++++++++++++++++++++++++++
>  gcc/config/arc/genoptions.awk      |  86 ++++++++++++++++
>  gcc/config/arc/t-arc               |  19 ++++
>  gcc/config/arc/t-arc-newlib        |  46 ---------
>  gcc/config/arc/t-arc-uClibc        |  20 ----
>  gcc/config/arc/t-multilib          |  34 +++++++
>  gcc/config/arc/t-uClibc            |  20 ++++
>  gcc/doc/invoke.texi                |  90 +++++++++++++---
>  23 files changed, 1235 insertions(+), 376 deletions(-)
>  create mode 100644 gcc/config/arc/arc-arch.h
>  create mode 100644 gcc/config/arc/arc-arches.def
>  create mode 100644 gcc/config/arc/arc-cpus.def
>  create mode 100644 gcc/config/arc/arc-options.def
>  create mode 100644 gcc/config/arc/arc-tables.opt
>  create mode 100644 gcc/config/arc/driver-arc.c
>  create mode 100644 gcc/config/arc/genmultilib.awk
>  create mode 100644 gcc/config/arc/genoptions.awk
>  delete mode 100644 gcc/config/arc/t-arc-newlib
>  delete mode 100644 gcc/config/arc/t-arc-uClibc
>  create mode 100644 gcc/config/arc/t-multilib
>  create mode 100644 gcc/config/arc/t-uClibc
> 
> diff --git a/gcc/common/config/arc/arc-common.c 
> b/gcc/common/config/arc/arc-common.c
> index 5b687fb..2898860 100644
> --- a/gcc/common/config/arc/arc-common.c
> +++ b/gcc/common/config/arc/arc-common.c
> @@ -2,6 +2,7 @@
>     Copyright (C) 1994-2016 Free Software Foundation, Inc.
>     Contributor: Joern Rennecke <joern.renne...@embecosm.com>
>               on behalf of Synopsys Inc.
> +             Claudiu Zissulescu <claudiu.zissule...@synopsys.com>
>  
>  This file is part of GCC.
>  
> @@ -61,17 +62,19 @@ static const struct default_options 
> arc_option_optimization_table[] =
>  
>  /*  Process options.  */
>  static bool
> -arc_handle_option (struct gcc_options *opts, struct gcc_options *opts_set,
> +arc_handle_option (struct gcc_options *opts,
> +                struct gcc_options *opts_set ATTRIBUTE_UNUSED,
>                  const struct cl_decoded_option *decoded,
>                  location_t loc)
>  {
>    size_t code = decoded->opt_index;
>    int value = decoded->value;
>    const char *arg = decoded->arg;
> +  static int mcpu_seen = PROCESSOR_NONE;
> +  char *p;
>  
>    switch (code)
>      {
> -      static int mcpu_seen = PROCESSOR_NONE;
>      case OPT_mcpu_:
>        /* N.B., at this point arc_cpu has already been set to its new value by
>        our caller, so comparing arc_cpu with PROCESSOR_NONE is pointless.  */
> @@ -79,71 +82,130 @@ arc_handle_option (struct gcc_options *opts, struct 
> gcc_options *opts_set,
>        if (mcpu_seen != PROCESSOR_NONE && mcpu_seen != value)
>       warning_at (loc, 0, "multiple -mcpu= options specified.");
>        mcpu_seen = value;
> +      break;
> +
> +    case OPT_mmpy_option_:
> +      p = ASTRDUP (arg);
>  
> -      switch (value)
> +      if (!strcmp (p, "0")
> +       || !strcmp (p, "none"))
> +     opts->x_arc_mpy_option = 0;
> +      else if (!strcmp (p, "1")
> +       || !strcmp (p, "w"))
>       {
> -     case PROCESSOR_NPS400:
> -       if (! (opts_set->x_TARGET_CASE_VECTOR_PC_RELATIVE) )
> -         opts->x_TARGET_CASE_VECTOR_PC_RELATIVE = 1;
> -       /* Fall through */
> -     case PROCESSOR_ARC600:
> -     case PROCESSOR_ARC700:
> -       if (! (opts_set->x_target_flags & MASK_BARREL_SHIFTER) )
> -         opts->x_target_flags |= MASK_BARREL_SHIFTER;
> -       break;
> -     case PROCESSOR_ARC601:
> -       if (! (opts_set->x_target_flags & MASK_BARREL_SHIFTER) )
> -         opts->x_target_flags &= ~MASK_BARREL_SHIFTER;
> -       break;
> -     case PROCESSOR_ARCHS:
> -       if ( !(opts_set->x_target_flags & MASK_BARREL_SHIFTER))
> -         opts->x_target_flags |= MASK_BARREL_SHIFTER;  /* Default: on.  */
> -       if ( !(opts_set->x_target_flags & MASK_CODE_DENSITY))
> -         opts->x_target_flags |= MASK_CODE_DENSITY;    /* Default: on.  */
> -       if ( !(opts_set->x_target_flags & MASK_NORM_SET))
> -         opts->x_target_flags |= MASK_NORM_SET;        /* Default: on.  */
> -       if ( !(opts_set->x_target_flags & MASK_SWAP_SET))
> -         opts->x_target_flags |= MASK_SWAP_SET;        /* Default: on.  */
> -       if ( !(opts_set->x_target_flags & MASK_DIVREM))
> -         opts->x_target_flags |= MASK_DIVREM;          /* Default: on.  */
> -       break;
> -
> -     case PROCESSOR_ARCEM:
> -       if ( !(opts_set->x_target_flags & MASK_BARREL_SHIFTER))
> -         opts->x_target_flags |= MASK_BARREL_SHIFTER;  /* Default: on.  */
> -       if ( !(opts_set->x_target_flags & MASK_CODE_DENSITY))
> -         opts->x_target_flags &= ~MASK_CODE_DENSITY;   /* Default: off.  */
> -       if ( !(opts_set->x_target_flags & MASK_NORM_SET))
> -         opts->x_target_flags &= ~MASK_NORM_SET;       /* Default: off.  */
> -       if ( !(opts_set->x_target_flags & MASK_SWAP_SET))
> -         opts->x_target_flags &= ~MASK_SWAP_SET;       /* Default: off.  */
> -       if ( !(opts_set->x_target_flags & MASK_DIVREM))
> -         opts->x_target_flags &= ~MASK_DIVREM;         /* Default: off.  */
> -       break;
> -     default:
> -       gcc_unreachable ();
> +       opts->x_arc_mpy_option = 1;
> +       warning_at (loc, 0, "Unsupported value for mmpy-option");
>       }
> +      else if (!strcmp (p, "2")
> +            || !strcmp (p, "mpy")
> +            || !strcmp (p, "wlh1"))
> +     opts->x_arc_mpy_option = 2;
> +      else if (!strcmp (p, "3")
> +            || !strcmp (p, "wlh2"))
> +     opts->x_arc_mpy_option = 3;
> +      else if (!strcmp (p, "4")
> +            || !strcmp (p, "wlh3"))
> +     opts->x_arc_mpy_option = 4;
> +      else if (!strcmp (p, "5")
> +            || !strcmp (p, "wlh4"))
> +     opts->x_arc_mpy_option = 5;
> +      else if (!strcmp (p, "6")
> +            || !strcmp (p, "wlh5"))
> +     opts->x_arc_mpy_option = 6;
> +      else if (!strcmp (p, "7")
> +            || !strcmp (p, "plus_dmpy"))
> +     opts->x_arc_mpy_option = 7;
> +      else if (!strcmp (p, "8")
> +            || !strcmp (p, "plus_macd"))
> +     opts->x_arc_mpy_option = 8;
> +      else if (!strcmp (p, "9")
> +            || !strcmp (p, "plus_qmacw"))
> +     opts->x_arc_mpy_option = 9;
> +      else
> +     error_at (loc, "unknown value %qs for -mmpy-option", arg);
> +
>        break;
>  
> -    case OPT_mmpy_option_:
> -      if (value < 0 || value > 9)
> -     error_at (loc, "bad value %qs for -mmpy-option switch", arg);
> +    case OPT_mcode_density:
> +      opts->x_arc_seen_options |= MASK_CODE_DENSITY;
> +      break;
> +
> +    case OPT_mdiv_rem:
> +      opts->x_arc_seen_options |= MASK_DIVREM;
> +      break;
> +
> +    case OPT_mnorm:
> +      opts->x_arc_seen_options |= MASK_NORM_SET;
> +      break;
> +
> +    case OPT_matomic:
> +      opts->x_arc_seen_options |= MASK_ATOMIC;
> +      break;
> +
> +    case OPT_mll64:
> +      opts->x_arc_seen_options |= MASK_LL64;
> +      break;
> +
> +    case OPT_mbarrel_shifter:
> +      opts->x_arc_seen_options |= MASK_BARREL_SHIFTER;
> +      break;
> +
> +    case OPT_mswap:
> +      opts->x_arc_seen_options |= MASK_SWAP_SET;
> +      break;
> +
> +    case OPT_mmul64:
> +      opts->x_arc_seen_options |= MASK_MUL64_SET;
> +      break;
> +
> +    case OPT_mmul32x16:
> +      opts->x_arc_seen_options |= MASK_MULMAC_32BY16_SET;
> +      break;
> +
> +    case OPT_mEA:
> +      opts->x_arc_seen_options |= MASK_EA_SET;
> +      break;
> +
> +    case OPT_mspfp:
> +    case OPT_mspfp_compact:
> +    case OPT_mspfp_fast:
> +      opts->x_arc_seen_options |= MASK_SPFP_COMPACT_SET;
> +      break;
> +
> +    case OPT_mdpfp:
> +    case OPT_mdpfp_compact:
> +    case OPT_mdpfp_fast:
> +      opts->x_arc_seen_options |= MASK_DPFP_COMPACT_SET;
> +      break;
> +
> +    case OPT_margonaut:
> +      opts->x_arc_seen_options |= MASK_ARGONAUT_SET;
> +      break;
> +
> +    case OPT_msimd:
> +      opts->x_arc_seen_options |= MASK_SIMD_SET;
> +      break;

I'd be interested to know if you considered making use of
opts_seen->x_target_flags instead of the new x_arc_seen_options?  And
if you did, but rejected it, why it doesn't solve the problem.  I
think making the switch would mean a lot of the new code above can
go.

> +
> +    default:
>        break;
>      }
>  
>    return true;
>  }
>  
> +#undef  TARGET_OPTION_INIT_STRUCT
>  #define TARGET_OPTION_INIT_STRUCT arc_option_init_struct
> +
> +#undef  TARGET_OPTION_OPTIMIZATION_TABLE
>  #define TARGET_OPTION_OPTIMIZATION_TABLE arc_option_optimization_table
> -#define TARGET_HANDLE_OPTION arc_handle_option
>  
>  #define DEFAULT_NO_SDATA (TARGET_SDATA_DEFAULT ? 0 : MASK_NO_SDATA_SET)
>  
> -/* We default to ARC700, which has the barrel shifter enabled.  */
> -#define TARGET_DEFAULT_TARGET_FLAGS \
> -  (MASK_BARREL_SHIFTER|MASK_VOLATILE_CACHE_SET|DEFAULT_NO_SDATA)
> +#undef  TARGET_DEFAULT_TARGET_FLAGS
> +#define TARGET_DEFAULT_TARGET_FLAGS (DEFAULT_NO_SDATA | 
> MASK_VOLATILE_CACHE_SET)
>  
> +#undef  TARGET_HANDLE_OPTION
> +#define TARGET_HANDLE_OPTION arc_handle_option
>  
>  #include "common/common-target-def.h"
>  
> diff --git a/gcc/config.gcc b/gcc/config.gcc
> index 8fd07c5..50dca89 100644
> --- a/gcc/config.gcc
> +++ b/gcc/config.gcc
> @@ -318,6 +318,7 @@ arc*-*-*)
>       cpu_type=arc
>       c_target_objs="arc-c.o"
>       cxx_target_objs="arc-c.o"
> +     extra_options="${extra_options} arc/arc-tables.opt"
>       ;;
>  arm*-*-*)
>       cpu_type=arm
> @@ -991,13 +992,12 @@ alpha*-dec-*vms*)
>       ;;
>  arc*-*-elf*)
>       extra_headers="arc-simd.h"
> -     tm_file="dbxelf.h elfos.h newlib-stdint.h ${tm_file}"
> -     tmake_file="arc/t-arc-newlib arc/t-arc"
> -     case x"${with_cpu}" in
> -       xarc600|xarc601|xarc700)
> -             target_cpu_default="TARGET_CPU_$with_cpu"
> -             ;;
> -     esac
> +     tm_file="arc/arc-arch.h dbxelf.h elfos.h newlib-stdint.h ${tm_file}"
> +     tmake_file="arc/t-multilib arc/t-arc"
> +     extra_gcc_objs="driver-arc.o"
> +     if test "x$with_cpu" != x; then
> +             tm_defines="${tm_defines} TARGET_CPU_BUILD=PROCESSOR_$with_cpu"
> +     fi
>       if test x${with_endian} = x; then
>               case ${target} in
>               arc*be-*-* | arc*eb-*-*)        with_endian=big ;;
> @@ -1014,15 +1014,14 @@ arc*-*-elf*)
>       ;;
>  arc*-*-linux-uclibc*)
>       extra_headers="arc-simd.h"
> -     tm_file="dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h ${tm_file}"
> -     tmake_file="${tmake_file} arc/t-arc-uClibc arc/t-arc"
> +     tm_file="arc/arc-arch.h dbxelf.h elfos.h gnu-user.h linux.h 
> glibc-stdint.h ${tm_file}"
> +     tmake_file="${tmake_file} arc/t-uClibc arc/t-arc"
>       tm_defines="${tm_defines} TARGET_SDATA_DEFAULT=0"
>       tm_defines="${tm_defines} TARGET_MMEDIUM_CALLS_DEFAULT=1"
> -     case x"${with_cpu}" in
> -       xarc600|xarc601|xarc700)
> -             target_cpu_default="TARGET_CPU_$with_cpu"
> -             ;;
> -     esac
> +     extra_gcc_objs="driver-arc.o"
> +     if test "x$with_cpu" != x; then
> +             tm_defines="${tm_defines} TARGET_CPU_BUILD=PROCESSOR_$with_cpu"
> +     fi
>       if test x${with_endian} = x; then
>               case ${target} in
>               arc*be-*-* | arc*eb-*-*)        with_endian=big ;;
> @@ -3605,15 +3604,19 @@ case "${target}" in
>               done
>               ;;
>  
> -     arc*-*-*) # was:        arc*-*-linux-uclibc)
> +     arc*-*-*)
>               supported_defaults="cpu"
> -             case $with_cpu in
> -               arc600|arc601|arc700)
> -                     ;;
> -               *) echo "Unknown cpu type"
> -                     exit 1
> -                     ;;
> -             esac
> +
> +             if [ x"$with_cpu" = x ] \
> +                 || grep "^ARC_CPU ($with_cpu," \
> +                    ${srcdir}/config/arc/arc-cpus.def \
> +                    > /dev/null; then
> +              # Ok
> +              true
> +             else
> +              echo "Unknown cpu used in --with-cpu=$with_cpu" 1>&2
> +              exit 1
> +             fi
>               ;;
>  
>       arm*-*-*)
> diff --git a/gcc/config/arc/arc-arch.h b/gcc/config/arc/arc-arch.h
> new file mode 100644
> index 0000000..7994543
> --- /dev/null
> +++ b/gcc/config/arc/arc-arch.h
> @@ -0,0 +1,120 @@
> +/* Definitions of types that are used to store ARC architecture and
> +   device information.
> +   Copyright (C) 2016 Free Software Foundation, Inc.
> +   Contributed by Claudiu Zissulescu (claz...@synopsys.com)
> +
> +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_ARC_ARCH_H
> +#define GCC_ARC_ARCH_H
> +
> +#ifndef IN_LIBGCC2
> +/* Architecture selection types.  */
> +
> +enum cpu_flags
> +  {
> +#define ARC_OPT(NAME, CODE, MASK, DOC)           NAME = CODE,
> +#define ARC_OPTX(NAME, CODE, VAR, VAL, DOC) NAME = CODE,
> +#include "arc-options.def"
> +#undef ARC_OPT
> +#undef ARC_OPTX
> +    FL_END
> +  };
> +
> +
> +/* ARC architecture variants.  */
> +
> +enum base_architecture
> +  {
> +    BASE_ARCH_NONE,
> +#define ARC_ARCH(NAME, ARCH, FLAGS, DFLAGS)  BASE_ARCH_##ARCH,
> +#include "arc-arches.def"
> +#undef ARC_ARCH
> +    BASE_ARCH_END
> +  };
> +
> +
> +/* Tune variants.  Needs to match the attr_tune enum.  */
> +
> +enum arc_tune_attr
> +  {
> +    ARC_TUNE_NONE,
> +    ARC_TUNE_ARC600,
> +    ARC_TUNE_ARC700_4_2_STD,
> +    ARC_TUNE_ARC700_4_2_XMAC
> +  };
> +
> +/* CPU specific properties.  */
> +
> +typedef struct
> +{
> +  /* CPU name.  */
> +  const char *const name;
> +
> +  /* Architecture class.  */
> +  enum base_architecture arch;
> +
> +  /* Specific flags.  */
> +  const unsigned long long flags;
> +
> +  /* Tune value.  */
> +  enum arc_tune_attr tune;
> +} arc_cpu_t;
> +
> +
> +/* Architecture specific propoerties.  */
> +
> +typedef struct
> +{
> +  /* Architecture name.  */
> +  const char *const name;
> +
> +  /* Architecture class.  */
> +  enum base_architecture arch;
> +
> +  /* All allowed flags for this architecture.  */
> +  const unsigned long long flags;
> +
> +  /* Default flags for this architecture.  It is a subset of
> +     FLAGS.  */
> +  const unsigned long long dflags;
> +} arc_arch_t;
> +
> +
> +
> +const arc_arch_t arc_arch_types[] =
> +  {
> +    {"none", BASE_ARCH_NONE, 0, 0},
> +#define ARC_ARCH(NAME, ARCH, FLAGS, DFLAGS)  \
> +    {NAME, BASE_ARCH_##ARCH, FLAGS, DFLAGS},
> +#include "arc-arches.def"
> +#undef ARC_ARCH
> +    {NULL, BASE_ARCH_END, 0, 0}
> +  };
> +
> +const arc_cpu_t arc_cpu_types[] =
> +  {
> +    {"none", BASE_ARCH_NONE, 0, ARC_TUNE_NONE},
> +#define ARC_CPU(NAME, ARCH, FLAGS, TUNE)     \
> +    {#NAME, BASE_ARCH_##ARCH, FLAGS, ARC_TUNE_##TUNE},
> +#include "arc-cpus.def"
> +#undef ARC_CPU
> +    {NULL, BASE_ARCH_END, 0, ARC_TUNE_NONE}
> +  };
> +
> +#endif
> +#endif /* GCC_ARC_ARCH_H */
> diff --git a/gcc/config/arc/arc-arches.def b/gcc/config/arc/arc-arches.def
> new file mode 100644
> index 0000000..bd76124
> --- /dev/null
> +++ b/gcc/config/arc/arc-arches.def
> @@ -0,0 +1,35 @@
> +/* ARC ARCH architectures.
> +   Copyright (C) 2016 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/>.  */
> +
> +ARC_ARCH ("arcem", em, FL_MPYOPT_1_6 | FL_DIVREM | FL_CD | FL_NORM   \
> +       | FL_BS | FL_SWAP | FL_FPUS | FL_SPFP | FL_DPFP               \
> +       | FL_SIMD | FL_FPUDA, 0)
> +ARC_ARCH ("archs", hs, FL_MPYOPT_7_9 | FL_DIVREM | FL_NORM | FL_CD   \
> +       | FL_ATOMIC | FL_LL64 | FL_BS | FL_SWAP                       \
> +       | FL_FPUS | FL_FPUD,                                          \
> +       FL_CD | FL_ATOMIC | FL_BS | FL_NORM | FL_SWAP)
> +ARC_ARCH ("arc6xx", 6xx, FL_BS | FL_NORM | FL_SWAP | FL_MUL64 | FL_MUL32x16 \
> +       | FL_SPFP | FL_ARGONAUT | FL_DPFP, 0)
> +ARC_ARCH ("arc700", 700, FL_ATOMIC | FL_BS | FL_NORM | FL_SWAP | FL_EA \
> +       | FL_SIMD | FL_SPFP | FL_ARGONAUT | FL_DPFP,                 \
> +       FL_BS | FL_NORM | FL_SWAP)
> +
> +/* Local Variables: */
> +/* mode: c */
> +/* End: */
> diff --git a/gcc/config/arc/arc-c.def b/gcc/config/arc/arc-c.def
> index 065e973..4cfd7b6 100644
> --- a/gcc/config/arc/arc-c.def
> +++ b/gcc/config/arc/arc-c.def
> @@ -66,3 +66,7 @@ ARC_C_DEF ("__EM__",     TARGET_EM)
>  ARC_C_DEF ("__HS__",     TARGET_HS)
>  ARC_C_DEF ("__Xnorm",    TARGET_NORM)
>  ARC_C_DEF ("__Xbarrel_shifter", TARGET_BARREL_SHIFTER)
> +
> +/* Local Variables: */
> +/* mode: c */
> +/* End: */
> diff --git a/gcc/config/arc/arc-cpus.def b/gcc/config/arc/arc-cpus.def
> new file mode 100644
> index 0000000..381507c
> --- /dev/null
> +++ b/gcc/config/arc/arc-cpus.def
> @@ -0,0 +1,47 @@
> +/* ARC CPU architectures.
> +   Copyright (C) 2016 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/>.  */
> +
> +ARC_CPU (em,     em, 0, NONE)
> +ARC_CPU (arcem,          em, FL_MPYOPT_2|FL_CD|FL_BS, NONE)
> +ARC_CPU (em4,            em, FL_CD, NONE)
> +ARC_CPU (em4_dmips, em, FL_MPYOPT_2|FL_CD|FL_DIVREM|FL_NORM|FL_SWAP|FL_BS, 
> NONE)
> +ARC_CPU (em4_fpus,  em, 
> FL_MPYOPT_2|FL_CD|FL_DIVREM|FL_NORM|FL_SWAP|FL_BS|FL_FPU_FPUS, NONE)
> +ARC_CPU (em4_fpuda, em, 
> FL_MPYOPT_2|FL_CD|FL_DIVREM|FL_NORM|FL_SWAP|FL_BS|FL_FPU_FPUDA, NONE)
> +
> +ARC_CPU (hs,      hs, 0, NONE)
> +ARC_CPU (archs,           hs, FL_MPYOPT_2|FL_DIVREM|FL_LL64, NONE)
> +ARC_CPU (hs34,            hs, FL_MPYOPT_2, NONE)
> +ARC_CPU (hs38,            hs, FL_MPYOPT_9|FL_DIVREM|FL_LL64, NONE)
> +ARC_CPU (hs38_linux, hs, FL_MPYOPT_9|FL_DIVREM|FL_LL64|FL_FPU_FPUD_ALL, NONE)
> +
> +ARC_CPU (arc600,       6xx, FL_BS, ARC600)
> +ARC_CPU (arc600_norm,          6xx, FL_BS|FL_NORM, ARC600)
> +ARC_CPU (arc600_mul64,         6xx, FL_BS|FL_NORM|FL_MUL64, ARC600)
> +ARC_CPU (arc600_mul32x16, 6xx, FL_BS|FL_NORM|FL_MUL32x16, ARC600)
> +ARC_CPU (arc601,       6xx, 0, ARC600)
> +ARC_CPU (arc601_norm,          6xx, FL_NORM, ARC600)
> +ARC_CPU (arc601_mul64,         6xx, FL_NORM|FL_MUL64, ARC600)
> +ARC_CPU (arc601_mul32x16, 6xx, FL_NORM|FL_MUL32x16, ARC600)
> +
> +ARC_CPU (arc700, 700, 0, ARC700_4_2_STD)
> +ARC_CPU (nps400, 700, 0, ARC700_4_2_STD)
> +
> +/* Local Variables: */
> +/* mode: c */
> +/* End: */
> diff --git a/gcc/config/arc/arc-options.def b/gcc/config/arc/arc-options.def
> new file mode 100644
> index 0000000..083719a
> --- /dev/null
> +++ b/gcc/config/arc/arc-options.def
> @@ -0,0 +1,69 @@
> +/* ARC options.
> +   Copyright (C) 2016 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/>.  */
> +
> +ARC_OPT (FL_CD,            (1ULL << 0), MASK_CODE_DENSITY,      "code 
> density")
> +ARC_OPT (FL_DIVREM,   (1ULL << 1), MASK_DIVREM,                 "div/rem")
> +ARC_OPT (FL_NORM,     (1ULL << 2), MASK_NORM_SET,       "norm")
> +
> +ARC_OPT (FL_ATOMIC,   (1ULL << 4), MASK_ATOMIC,                 "atomic")
> +ARC_OPT (FL_LL64,     (1ULL << 5), MASK_LL64,                   "double 
> load/store")
> +ARC_OPT (FL_BS,            (1ULL << 6), MASK_BARREL_SHIFTER,    "barrel 
> shifter")
> +ARC_OPT (FL_SWAP,     (1ULL << 7), MASK_SWAP_SET,       "swap")
> +ARC_OPT (FL_MUL64,    (1ULL << 8), MASK_MUL64_SET,      "mul64")
> +ARC_OPT (FL_MUL32x16, (1ULL << 9), MASK_MULMAC_32BY16_SET, "mul32x16")
> +
> +ARC_OPT (FL_EA,            (1ULL << 11), MASK_EA_SET,           "extended 
> arithmetics")
> +ARC_OPT (FL_SPFP,     (1ULL << 12), MASK_SPFP_COMPACT_SET, "single 
> precission FPX")
> +ARC_OPT (FL_DPFP,     (1ULL << 13), MASK_DPFP_COMPACT_SET, "double 
> precission FPX")
> +ARC_OPT (FL_ARGONAUT, (1ULL << 14), MASK_ARGONAUT_SET,          "argonaut")
> +ARC_OPT (FL_SIMD,     (1ULL << 15), MASK_SIMD_SET,      "simd")
> +
> +ARC_OPTX (FL_MPYOPT_1, (1ULL << 17), arc_mpy_option, 1, "mpy option w")
> +ARC_OPTX (FL_MPYOPT_2, (1ULL << 18), arc_mpy_option, 2, "mpy option wlh1")
> +ARC_OPTX (FL_MPYOPT_3, (1ULL << 19), arc_mpy_option, 3, "mpy option wlh2")
> +ARC_OPTX (FL_MPYOPT_4, (1ULL << 20), arc_mpy_option, 4, "mpy option wlh3")
> +ARC_OPTX (FL_MPYOPT_5, (1ULL << 21), arc_mpy_option, 5, "mpy option wlh4")
> +ARC_OPTX (FL_MPYOPT_6, (1ULL << 22), arc_mpy_option, 6, "mpy option wlh5")
> +ARC_OPTX (FL_MPYOPT_7, (1ULL << 23), arc_mpy_option, 7, "mpy option 
> plus_dmpy")
> +ARC_OPTX (FL_MPYOPT_8, (1ULL << 24), arc_mpy_option, 8, "mpy option 
> plus_macd")
> +ARC_OPTX (FL_MPYOPT_9, (1ULL << 25), arc_mpy_option, 9, "mpy option 
> plus_qmacw")
> +
> +ARC_OPT (FL_MPYOPT_7_9, (0x01c2ULL << 17), 0, "mpy option")
> +ARC_OPT (FL_MPYOPT_1_6, (0x003fULL << 17), 0, "mpy option")
> +
> +ARC_OPTX (FL_FPU_FPUS,           (1ULL << 26), arc_fpu_build, FPU_FPUS,      
> "mfpu=fpus")
> +ARC_OPTX (FL_FPU_FPUS_DIV,  (1ULL << 27), arc_fpu_build, FPU_FPUS_DIV,       
> "mfpu=fpus_div")
> +ARC_OPTX (FL_FPU_FPUS_FMA,  (1ULL << 28), arc_fpu_build, FPU_FPUS_FMA,       
> "mfpu=fpus_fma")
> +ARC_OPTX (FL_FPU_FPUS_ALL,  (1ULL << 29), arc_fpu_build, FPU_FPUS_ALL,       
> "mfpu=fpus_all")
> +ARC_OPTX (FL_FPU_FPUDA,          (1ULL << 30), arc_fpu_build, FPU_FPUDA,     
> "mfpu=fpuda")
> +ARC_OPTX (FL_FPU_FPUDA_DIV, (1ULL << 31), arc_fpu_build, FPU_FPUDA_DIV, 
> "mfpu=fpuda_div")
> +ARC_OPTX (FL_FPU_FPUDA_FMA, (1ULL << 32), arc_fpu_build, FPU_FPUDA_FMA, 
> "mfpu=fpuda_fma")
> +ARC_OPTX (FL_FPU_FPUDA_ALL, (1ULL << 33), arc_fpu_build, FPU_FPUDA_ALL, 
> "mfpu=fpuda_all")
> +ARC_OPTX (FL_FPU_FPUD,           (1ULL << 34), arc_fpu_build, FPU_FPUD,      
> "mfpu=fpud")
> +ARC_OPTX (FL_FPU_FPUD_DIV,  (1ULL << 35), arc_fpu_build, FPU_FPUD_DIV,       
> "mfpu=fpud_div")
> +ARC_OPTX (FL_FPU_FPUD_FMA,  (1ULL << 36), arc_fpu_build, FPU_FPUD_FMA,       
> "mfpu=fpud_fma")
> +ARC_OPTX (FL_FPU_FPUD_ALL,  (1ULL << 37), arc_fpu_build, FPU_FPUD_ALL,       
> "mfpu=fpud_all")
> +
> +ARC_OPT (FL_FPUS,  (0xFULL << 26), 0, "single precission floating point")
> +ARC_OPT (FL_FPUDA, (0xFFULL << 26), 0, "double precission fp assist")
> +ARC_OPT (FL_FPUD,  (0xF0FULL << 26), 0, "double precission floating point")
> +
> +/* Local Variables: */
> +/* mode: c */
> +/* End: */
> diff --git a/gcc/config/arc/arc-opts.h b/gcc/config/arc/arc-opts.h
> index cbd7898..81446b4 100644
> --- a/gcc/config/arc/arc-opts.h
> +++ b/gcc/config/arc/arc-opts.h
> @@ -18,15 +18,16 @@
>     along with GCC; see the file COPYING3.  If not see
>     <http://www.gnu.org/licenses/>.  */
>  
> +#ifndef ARC_OPTS_H
> +#define ARC_OPTS_H
> +
>  enum processor_type
>  {
> -  PROCESSOR_NONE,
> -  PROCESSOR_ARC600,
> -  PROCESSOR_ARC601,
> -  PROCESSOR_ARC700,
> -  PROCESSOR_NPS400,
> -  PROCESSOR_ARCEM,
> -  PROCESSOR_ARCHS
> +  PROCESSOR_NONE = 0,
> +#define ARC_CPU(NAME, ARCH, FLAGS, TUNE)  PROCESSOR_##NAME,
> +#include "arc-cpus.def"
> +#undef ARC_CPU
> +  PROCESSOR_generic
>  };
>  
>  /* Single precision floating point.  */
> @@ -48,3 +49,35 @@ enum processor_type
>  /* Double precision floating point assist operations.  */
>  #define FPX_DP    0x0100
>  
> +/* fpus option combi.  */
> +#define FPU_FPUS  (FPU_SP | FPU_SC)
> +/* fpud option combi.  */
> +#define FPU_FPUD  (FPU_SP | FPU_SC | FPU_DP | FPU_DC)
> +/* fpuda option combi.  */
> +#define FPU_FPUDA (FPU_SP | FPU_SC | FPX_DP)
> +/* fpuda_div option combi.  */
> +#define FPU_FPUDA_DIV (FPU_SP | FPU_SC | FPU_SD | FPX_DP)
> +/* fpuda_fma option combi.  */
> +#define FPU_FPUDA_FMA (FPU_SP | FPU_SC | FPU_SF | FPX_DP)
> +/* fpuda_all option combi.  */
> +#define FPU_FPUDA_ALL (FPU_SP | FPU_SC | FPU_SF | FPU_SD | FPX_DP)
> +/* fpus_div option combi.  */
> +#define FPU_FPUS_DIV  (FPU_SP | FPU_SC | FPU_SD)
> +/* fpus_fma option combi.  */
> +#define FPU_FPUS_FMA  (FPU_SP | FPU_SC | FPU_SF)
> +/* fpus_all option combi.  */
> +#define FPU_FPUS_ALL  (FPU_SP | FPU_SC | FPU_SF | FPU_SD)
> +/* fpud_div option combi.  */
> +#define FPU_FPUD_DIV  (FPU_FPUS_DIV | FPU_DP | FPU_DC | FPU_DD)
> +/* fpud_fma option combi.  */
> +#define FPU_FPUD_FMA  (FPU_FPUS_FMA | FPU_DP | FPU_DC | FPU_DF)
> +/* fpud_all option combi.  */
> +#define FPU_FPUD_ALL  (FPU_FPUS_ALL | FPU_DP | FPU_DC | FPU_DF | FPU_DD)
> +
> +/* Default FPU option value.  */
> +#define DEFAULT_arc_fpu_build 0x10000000
> +
> +/* Default MPY option value.  */
> +#define DEFAULT_arc_mpy_option -1
> +
> +#endif /* ARC_OPTS_H */
> diff --git a/gcc/config/arc/arc-protos.h b/gcc/config/arc/arc-protos.h
> index ad5d4d3..d1266b4 100644
> --- a/gcc/config/arc/arc-protos.h
> +++ b/gcc/config/arc/arc-protos.h
> @@ -52,7 +52,6 @@ extern enum arc_function_type arc_compute_function_type 
> (struct function *);
>  #endif /* TREE_CODE */
>  
>  
> -extern void arc_init (void);
>  extern unsigned int arc_compute_frame_size (int);
>  extern bool arc_ccfsm_branch_deleted_p (void);
>  extern void arc_ccfsm_record_branch_deleted (void);
> diff --git a/gcc/config/arc/arc-tables.opt b/gcc/config/arc/arc-tables.opt
> new file mode 100644
> index 0000000..0e7c50c
> --- /dev/null
> +++ b/gcc/config/arc/arc-tables.opt
> @@ -0,0 +1,90 @@
> +; Auto-generated Makefile Snip
> +; Generated by    : ./gcc/config/arc/genoptions.awk
> +; Generated from  : ./gcc/config/arc/arc-cpu.def
> +;
> +; Copyright (C) 2016 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/>.
> +
> +Enum
> +Name(processor_type) Type(enum processor_type)
> +Known ARC CPUs (for use with the -mcpu= option):
> +
> +EnumValue
> +Enum(processor_type) String(em) Value(PROCESSOR_em)
> +
> +EnumValue
> +Enum(processor_type) String(arcem) Value(PROCESSOR_arcem)
> +
> +EnumValue
> +Enum(processor_type) String(em4) Value(PROCESSOR_em4)
> +
> +EnumValue
> +Enum(processor_type) String(em4_dmips) Value(PROCESSOR_em4_dmips)
> +
> +EnumValue
> +Enum(processor_type) String(em4_fpus) Value(PROCESSOR_em4_fpus)
> +
> +EnumValue
> +Enum(processor_type) String(em4_fpuda) Value(PROCESSOR_em4_fpuda)
> +
> +EnumValue
> +Enum(processor_type) String(hs) Value(PROCESSOR_hs)
> +
> +EnumValue
> +Enum(processor_type) String(archs) Value(PROCESSOR_archs)
> +
> +EnumValue
> +Enum(processor_type) String(hs34) Value(PROCESSOR_hs34)
> +
> +EnumValue
> +Enum(processor_type) String(hs38) Value(PROCESSOR_hs38)
> +
> +EnumValue
> +Enum(processor_type) String(hs38_linux) Value(PROCESSOR_hs38_linux)
> +
> +EnumValue
> +Enum(processor_type) String(arc600) Value(PROCESSOR_arc600)
> +
> +EnumValue
> +Enum(processor_type) String(arc600_norm) Value(PROCESSOR_arc600_norm)
> +
> +EnumValue
> +Enum(processor_type) String(arc600_mul64) Value(PROCESSOR_arc600_mul64)
> +
> +EnumValue
> +Enum(processor_type) String(arc600_mul32x16) Value(PROCESSOR_arc600_mul32x16)
> +
> +EnumValue
> +Enum(processor_type) String(arc601) Value(PROCESSOR_arc601)
> +
> +EnumValue
> +Enum(processor_type) String(arc601_norm) Value(PROCESSOR_arc601_norm)
> +
> +EnumValue
> +Enum(processor_type) String(arc601_mul64) Value(PROCESSOR_arc601_mul64)
> +
> +EnumValue
> +Enum(processor_type) String(arc601_mul32x16) Value(PROCESSOR_arc601_mul32x16)
> +
> +EnumValue
> +Enum(processor_type) String(arc700) Value(PROCESSOR_arc700)
> +
> +EnumValue
> +Enum(processor_type) String(nps400) Value(PROCESSOR_nps400)
> +
> +
> diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
> index 5e8d6b4..cfb3531 100644
> --- a/gcc/config/arc/arc.c
> +++ b/gcc/config/arc/arc.c
> @@ -64,7 +64,8 @@ along with GCC; see the file COPYING3.  If not see
>  #include "alias.h"
>  
>  /* Which cpu we're compiling for (ARC600, ARC601, ARC700).  */
> -static const char *arc_cpu_string = "";
> +static char arc_cpu_name[10] = "";
> +static const char *arc_cpu_string = arc_cpu_name;
>  
>  /* ??? Loads can handle any constant, stores can only handle small ones.  */
>  /* OTOH, LIMMs cost extra, so their usefulness is limited.  */
> @@ -241,6 +242,16 @@ static bool arc_use_by_pieces_infrastructure_p (unsigned 
> HOST_WIDE_INT,
>                                               enum by_pieces_operation op,
>                                               bool);
>  
> +static const arc_cpu_t *arc_selected_cpu;
> +static const arc_arch_t *arc_selected_arch;
> +
> +/* Global var which sets the current compilation architecture.  */
> +bool arc_arcem = false;
> +bool arc_archs = false;
> +bool arc_arc700 = false;
> +bool arc_arc600 = false;
> +bool arc_arc601 = false;
> +
>  /* Implements target hook vector_mode_supported_p.  */
>  
>  static bool
> @@ -668,47 +679,9 @@ make_pass_arc_predicate_delay_insns (gcc::context *ctxt)
>  
>  /* Called by OVERRIDE_OPTIONS to initialize various things.  */
>  
> -void
> +static void
>  arc_init (void)
>  {
> -  enum attr_tune tune_dflt = TUNE_NONE;
> -
> -  switch (arc_cpu)
> -    {
> -    case PROCESSOR_ARC600:
> -      arc_cpu_string = "ARC600";
> -      tune_dflt = TUNE_ARC600;
> -      break;
> -
> -    case PROCESSOR_ARC601:
> -      arc_cpu_string = "ARC601";
> -      tune_dflt = TUNE_ARC600;
> -      break;
> -
> -    case PROCESSOR_ARC700:
> -      arc_cpu_string = "ARC700";
> -      tune_dflt = TUNE_ARC700_4_2_STD;
> -      break;
> -
> -    case PROCESSOR_NPS400:
> -      arc_cpu_string = "NPS400";
> -      tune_dflt = TUNE_ARC700_4_2_STD;
> -      break;
> -
> -    case PROCESSOR_ARCEM:
> -      arc_cpu_string = "EM";
> -      break;
> -
> -    case PROCESSOR_ARCHS:
> -      arc_cpu_string = "HS";
> -      break;
> -
> -    default:
> -      gcc_unreachable ();
> -    }
> -
> -  if (arc_tune == TUNE_NONE)
> -    arc_tune = tune_dflt;
>    /* Note: arc_multcost is only used in rtx_cost if speed is true.  */
>    if (arc_multcost < 0)
>      switch (arc_tune)
> @@ -739,18 +712,10 @@ arc_init (void)
>       break;
>        }
>  
> -  /* Support mul64 generation only for ARC600.  */
> -  if (TARGET_MUL64_SET && (!TARGET_ARC600_FAMILY))
> -      error ("-mmul64 not supported for ARC700 or ARCv2");
> -
>    /* MPY instructions valid only for ARC700 or ARCv2.  */
>    if (TARGET_NOMPY_SET && TARGET_ARC600_FAMILY)
>        error ("-mno-mpy supported only for ARC700 or ARCv2");
>  
> -  /* mul/mac instructions only for ARC600.  */
> -  if (TARGET_MULMAC_32BY16_SET && (!TARGET_ARC600_FAMILY))
> -      error ("-mmul32x16 supported only for ARC600 or ARC601");
> -
>    if (!TARGET_DPFP && TARGET_DPFP_DISABLE_LRSR)
>        error ("-mno-dpfp-lrsr supported only with -mdpfp");
>  
> @@ -763,23 +728,11 @@ arc_init (void)
>    if (TARGET_SPFP_FAST_SET && TARGET_ARC600_FAMILY)
>      error ("-mspfp_fast not available on ARC600 or ARC601");
>  
> -  /* FPX-3. No FPX extensions on pre-ARC600 cores.  */
> -  if ((TARGET_DPFP || TARGET_SPFP)
> -      && (!TARGET_ARCOMPACT_FAMILY && !TARGET_EM))
> -    error ("FPX extensions not available on pre-ARC600 cores");
> -
> -  /* FPX-4.  No FPX extensions mixed with FPU extensions for ARC HS
> -     cpus.  */
> -  if ((TARGET_DPFP || TARGET_SPFP)
> -      && TARGET_HARD_FLOAT
> -      && TARGET_HS)
> +  /* FPX-4.  No FPX extensions mixed with FPU extensions.  */
> +  if ((TARGET_DPFP_FAST_SET || TARGET_DPFP_COMPACT_SET || TARGET_SPFP)
> +      && TARGET_HARD_FLOAT)
>      error ("No FPX/FPU mixing allowed");
>  
> -  /* Only selected multiplier configurations are available for HS.  */
> -  if (TARGET_HS && ((arc_mpy_option > 2 && arc_mpy_option < 7)
> -                 || (arc_mpy_option == 1)))
> -    error ("This multiplier configuration is not available for HS cores");
> -
>    /* Warn for unimplemented PIC in pre-ARC700 cores, and disable flag_pic.  
> */
>    if (flag_pic && TARGET_ARC600_FAMILY)
>      {
> @@ -789,26 +742,6 @@ arc_init (void)
>        flag_pic = 0;
>      }
>  
> -  if (TARGET_ATOMIC && !(TARGET_ARC700 || TARGET_HS))
> -    error ("-matomic is only supported for ARC700 or ARC HS cores");
> -
> -  /* ll64 ops only available for HS.  */
> -  if (TARGET_LL64 && !TARGET_HS)
> -    error ("-mll64 is only supported for ARC HS cores");
> -
> -  /* FPU support only for V2.  */
> -  if (TARGET_HARD_FLOAT)
> -    {
> -      if (TARGET_EM
> -       && (arc_fpu_build & ~(FPU_SP | FPU_SF | FPU_SC | FPU_SD | FPX_DP)))
> -     error ("FPU double precision options are available for ARC HS only");
> -      if (TARGET_HS && (arc_fpu_build & FPX_DP))
> -     error ("FPU double precision assist "
> -            "options are not available for ARC HS");
> -      if (!TARGET_HS && !TARGET_EM)
> -     error ("FPU options are available for ARCv2 architecture only");
> -    }
> -
>    arc_init_reg_tables ();
>  
>    /* Initialize array for PRINT_OPERAND_PUNCT_VALID_P.  */
> @@ -853,7 +786,92 @@ static void
>  arc_override_options (void)
>  {
>    if (arc_cpu == PROCESSOR_NONE)
> -    arc_cpu = PROCESSOR_ARC700;
> +    arc_cpu = TARGET_CPU_DEFAULT;
> +
> +  /* Set the default cpu options.  */
> +  arc_selected_cpu = &arc_cpu_types[(int) arc_cpu];
> +  arc_selected_arch = &arc_arch_types[(int) arc_selected_cpu->arch];
> +
> +  /* Set the architectures.  */
> +  switch (arc_selected_arch->arch)
> +    {
> +    case BASE_ARCH_em:
> +      arc_arcem = true;
> +      arc_cpu_string = "EM";
> +      break;
> +    case BASE_ARCH_hs:
> +      arc_archs = true;
> +      arc_cpu_string = "HS";
> +      break;
> +    case BASE_ARCH_700:
> +      arc_arc700 = true;
> +      arc_cpu_string = "ARC700";
> +      break;
> +    case BASE_ARCH_6xx:
> +      arc_cpu_string = "ARC600";
> +      if (arc_selected_cpu->flags & FL_BS)
> +     arc_arc600 = true;
> +      else
> +     arc_arc601 = true;
> +      break;
> +    default:
> +      gcc_unreachable ();
> +    }
> +
> +  /* Set cpu flags accordingly to architecture/selected cpu.  The cpu
> +     specific flags are set in arc-common.c.  The architecture forces
> +     the default hardware configurations in, regardless what command
> +     line options are saying.  The CPU optional hw options can be
> +     turned on or off.  */
> +#define ARC_OPT(NAME, CODE, MASK, DOC)               \
> +  do {                                               \
> +    if ((arc_selected_cpu->flags & CODE)     \
> +     && ((arc_seen_options & MASK) == 0))    \
> +      target_flags |= MASK;                  \

I think replacing arc_seen_options with
'global_options_seeen.x_target_flags' achieves the same thing here.


> +    if (arc_selected_arch->dflags & CODE)    \
> +      target_flags |= MASK;                  \
> +  } while (0);
> +#define ARC_OPTX(NAME, CODE, VAR, VAL, DOC)  \
> +  do {                                               \
> +    if ((arc_selected_cpu->flags & CODE)     \
> +     && (VAR == DEFAULT_##VAR))              \
> +      VAR = VAL;                             \
> +    if (arc_selected_arch->dflags & CODE)    \
> +      VAR = VAL;                             \
> +  } while (0);
> +
> +#include "arc-options.def"
> +
> +#undef ARC_OPTX
> +#undef ARC_OPT
> +
> +  /* Check options against architecture options.  Throw an error if
> +     option is not allowed.  */
> +#define ARC_OPTX(NAME, CODE, VAR, VAL, DOC)                  \
> +  do {                                                               \
> +    if ((VAR == VAL)                                         \
> +     && (!(arc_selected_arch->flags & CODE)))                \
> +      {                                                              \
> +     error ("%s is not available for %s architecture",       \
> +            DOC, arc_selected_arch->name);                   \
> +      }                                                              \
> +  } while (0);
> +#define ARC_OPT(NAME, CODE, MASK, DOC)                               \
> +  do {                                                               \
> +    if ((target_flags & MASK)                                        \
> +     && (!(arc_selected_arch->flags & CODE)))                \
> +      error ("%s is not available for %s architecture",              \
> +          DOC, arc_selected_arch->name);                     \
> +  } while (0);
> +
> +#include "arc-options.def"
> +
> +#undef ARC_OPTX
> +#undef ARC_OPT
> +
> +  /* Set Tune option.  */
> +  if (arc_tune == TUNE_NONE)
> +    arc_tune = (enum attr_tune) arc_selected_cpu->tune;
>  
>    if (arc_size_opt_level == 3)
>      optimize_size = 1;
> diff --git a/gcc/config/arc/arc.h b/gcc/config/arc/arc.h
> index c02e1cd..f1705d5 100644
> --- a/gcc/config/arc/arc.h
> +++ b/gcc/config/arc/arc.h
> @@ -28,6 +28,8 @@ along with GCC; see the file COPYING3.  If not see
>  #ifndef GCC_ARC_H
>  #define GCC_ARC_H
>  
> +#include <stdbool.h>
> +
>  /* Things to do:
>  
>     - incscc, decscc?
> @@ -39,6 +41,10 @@ along with GCC; see the file COPYING3.  If not see
>  #define SYMBOL_FLAG_LONG_CALL        (SYMBOL_FLAG_MACH_DEP << 2)
>  #define SYMBOL_FLAG_CMEM     (SYMBOL_FLAG_MACH_DEP << 3)
>  
> +#ifndef TARGET_CPU_DEFAULT
> +#define TARGET_CPU_DEFAULT   PROCESSOR_arc700
> +#endif
> +
>  /* Check if this symbol has a long_call attribute in its declaration */
>  #define SYMBOL_REF_LONG_CALL_P(X)    \
>       ((SYMBOL_REF_FLAGS (X) & SYMBOL_FLAG_LONG_CALL) != 0)
> @@ -74,9 +80,11 @@ along with GCC; see the file COPYING3.  If not see
>        GNU_USER_TARGET_OS_CPP_BUILTINS (); \
>      } \
>    while (0)
> -#endif
>  
> -/* Match the macros used in the assembler.  */
> +#endif /* DEFAULT_LIBC == LIBC_UCLIBC */
> +
> +/* Macros enabled by specific command line option.  FIXME: to be
> +   deprecatd.  */
>  #define CPP_SPEC "\
>  %{msimd:-D__Xsimd} %{mno-mpy:-D__Xno_mpy} %{mswap:-D__Xswap} \
>  %{mmin-max:-D__Xmin_max} %{mEA:-D__Xea} \
> @@ -85,34 +93,22 @@ along with GCC; see the file COPYING3.  If not see
>  %{mdsp-packa:-D__Xdsp_packa} %{mcrc:-D__Xcrc} %{mdvbf:-D__Xdvbf} \
>  %{mtelephony:-D__Xtelephony} %{mxy:-D__Xxy} %{mmul64: -D__Xmult32} \
>  %{mlock:-D__Xlock} %{mswape:-D__Xswape} %{mrtsc:-D__Xrtsc} \
> -%{mcpu=NPS400:-D__NPS400__} \
> -%{mcpu=nps400:-D__NPS400__} \
> -"
> +%{mcpu=nps400:-D__NPS400__}"
>  
>  #define CC1_SPEC "\
>  %{EB:%{EL:%emay not use both -EB and -EL}} \
>  %{EB:-mbig-endian} %{EL:-mlittle-endian} \
>  "
> +extern const char *arc_cpu_to_as (int argc, const char **argv);
> +
> +#define EXTRA_SPEC_FUNCTIONS                 \
> +  { "cpu_to_as", arc_cpu_to_as },
> +
> +#define ASM_SPEC  "%{mbig-endian|EB:-EB} %{EL} "                     \
> +  "%:cpu_to_as(%{mcpu=*:%*}) %{mspfp*} %{mdpfp*} %{mfpu=fpuda*:-mfpuda}"
>  
> -#define ASM_DEFAULT "-mARC700 -mEA"
> -
> -#define ASM_SPEC  "\
> -%{mbig-endian|EB:-EB} %{EL} \
> -%{mcpu=ARC600:-mARC600} \
> -%{mcpu=ARC601:-mARC601} \
> -%{mcpu=ARC700:-mARC700} \
> -%{mcpu=ARC700:-mEA} \
> -%{!mcpu=*:" ASM_DEFAULT "} \
> -%{mbarrel-shifter} %{mno-mpy} %{mmul64} %{mmul32x16:-mdsp-packa} %{mnorm} \
> -%{mswap} %{mEA} %{mmin-max} %{mspfp*} %{mdpfp*} %{mfpu=fpuda*:-mfpuda} \
> -%{msimd} \
> -%{mmac-d16} %{mmac-24} %{mdsp-packa} %{mcrc} %{mdvbf} %{mtelephony} %{mxy} \
> -%{mcpu=ARC700|!mcpu=*:%{mlock}} \
> -%{mcpu=ARC700|!mcpu=*:%{mswape}} \
> -%{mcpu=ARC700|!mcpu=*:%{mrtsc}} \
> -%{mcpu=ARCHS:-mHS} \
> -%{mcpu=ARCEM:-mEM} \
> -%{matomic:-mlock}"
> +#define OPTION_DEFAULT_SPECS                                         \
> +  {"cpu", "%{!mcpu=*:%{!mARC*:%{!marc*:%{!mA7:%{!mA6:-mcpu=%(VALUE)}}}}}" }
>  
>  #if DEFAULT_LIBC == LIBC_UCLIBC
>  /* Note that the default is to link against dynamic libraries, if they are
> @@ -196,17 +192,11 @@ along with GCC; see the file COPYING3.  If not see
>  #define TARGET_MMEDIUM_CALLS_DEFAULT 0
>  #endif
>  
> -#define DRIVER_SELF_SPECS DRIVER_ENDIAN_SELF_SPECS \
> -  "%{mARC600|mA6: -mcpu=ARC600 %<mARC600 %<mA6}" \
> -  "%{mARC601: -mcpu=ARC601 %<mARC601}" \
> -  "%{mARC700|mA7: -mcpu=ARC700 %<mARC700 %<mA7}" \
> -  "%{mbarrel_shifte*: -mbarrel-shifte%* %<mbarrel_shifte*}" \
> -  "%{mEA: -mea %<mEA}" \
> -  "%{mspfp_*: -mspfp-%* %<mspfp_*}" \
> -  "%{mdpfp_*: -mdpfp-%* %<mdpfp_*}" \
> -  "%{mdsp_pack*: -mdsp-pack%* %<mdsp_pack*}" \
> -  "%{mmac_*: -mmac-%* %<mmac_*}" \
> -  "%{multcost=*: -mmultcost=%* %<multcost=*}"
> +#define DRIVER_SELF_SPECS DRIVER_ENDIAN_SELF_SPECS              \
> +  "%{mARC600|mA6: -mcpu=arc600 %<mARC600 %<mA6 %<mARC600}"      \
> +  "%{mARC601: -mcpu=arc601 %<mARC601}"                                  \
> +  "%{mARC700|mA7: -mcpu=arc700 %<mARC700 %<mA7}"                \
> +  "%{mEA: -mea %<mEA}"
>  
>  /* Run-time compilation parameters selecting different hardware subsets.  */
>  
> @@ -252,20 +242,23 @@ along with GCC; see the file COPYING3.  If not see
>     use conditional execution?  */
>  #define TARGET_AT_DBR_CONDEXEC  (!TARGET_ARC700 && !TARGET_V2)
>  
> -#define TARGET_ARC600 (arc_cpu == PROCESSOR_ARC600)
> -#define TARGET_ARC601 (arc_cpu == PROCESSOR_ARC601)
> -#define TARGET_ARC700 (arc_cpu == PROCESSOR_ARC700   \
> -                    || arc_cpu == PROCESSOR_NPS400)
> -#define TARGET_EM     (arc_cpu == PROCESSOR_ARCEM)
> -#define TARGET_HS     (arc_cpu == PROCESSOR_ARCHS)
> -#define TARGET_V2                                                    \
> -  ((arc_cpu == PROCESSOR_ARCHS) || (arc_cpu == PROCESSOR_ARCEM))
> -
> -/* Recast the cpu class to be the cpu attribute.  */
> -#define arc_cpu_attr ((enum attr_cpu)arc_cpu)
> -
> -#ifndef MULTILIB_DEFAULTS
> -#define MULTILIB_DEFAULTS { "mARC700" }
> +extern bool arc_arcem;
> +extern bool arc_archs;
> +extern bool arc_arc700;
> +extern bool arc_arc600;
> +extern bool arc_arc601;
> +
> +#define TARGET_ARC600 (arc_arc600)
> +#define TARGET_ARC601 (arc_arc601)
> +#define TARGET_ARC700 (arc_arc700)
> +#define TARGET_EM (arc_arcem)
> +#define TARGET_HS (arc_archs)
> +#define TARGET_V2 (TARGET_EM || TARGET_HS)

Can you expand a little on the motivation and benefits of switching
from one variable holding the cpu type to a set of independent flags?

Do you expect that multiple flags might be true at the same time?  I
would think the model of having a single enum variable would be more
obvious and simpler to maintain.

> +
> +#ifdef ARC_MULTILIB_CPU_DEFAULT
> +# ifndef MULTILIB_DEFAULTS
> +#  define MULTILIB_DEFAULTS { "mcpu=" ARC_MULTILIB_CPU_DEFAULT }
> +# endif
>  #endif
>  
>  #ifndef UNALIGNED_ACCESS_DEFAULT
> diff --git a/gcc/config/arc/arc.md b/gcc/config/arc/arc.md
> index 715da31..6f757b6 100644
> --- a/gcc/config/arc/arc.md
> +++ b/gcc/config/arc/arc.md
> @@ -231,11 +231,6 @@
>        (eq_attr "is_CALL" "yes") (const_string "yes")]
>       (const_string "no")))
>  
> -
> -;; Attribute describing the processor
> -(define_attr "cpu" "none,ARC600,ARC700,ARCEM,ARCHS"
> -  (const (symbol_ref "arc_cpu_attr")))
> -
>  ;; true for compact instructions (those with _s suffix)
>  ;; "maybe" means compact unless we conditionalize the insn.
>  (define_attr "iscompact" "true,maybe,true_limm,maybe_limm,false"
> diff --git a/gcc/config/arc/arc.opt b/gcc/config/arc/arc.opt
> index 4caf366..1578549 100644
> --- a/gcc/config/arc/arc.opt
> +++ b/gcc/config/arc/arc.opt
> @@ -53,9 +53,12 @@ mARC700
>  Target Report
>  Same as -mA7.
>  
> +TargetVariable
> +int arc_mpy_option = DEFAULT_arc_mpy_option
> +
>  mmpy-option=
> -Target RejectNegative Joined UInteger Var(arc_mpy_option) Init(2)
> --mmpy-option={0,1,2,3,4,5,6,7,8,9} Compile ARCv2 code with a multiplier 
> design option.  Option 2 is default on.
> +Target RejectNegative Joined
> +-mmpy-option=MPY Compile ARCv2 code with a multiplier design option.
>  
>  mdiv-rem
>  Target Report Mask(DIVREM)
> @@ -100,7 +103,7 @@ Target Report Mask(MUL64_SET)
>  Generate mul64 and mulu64 instructions.
>  
>  mno-mpy
> -Target Report Mask(NOMPY_SET)
> +Target Report Mask(NOMPY_SET) Warn(%qs is deprecated)
>  Do not generate mpy instructions for ARC700.
>  
>  mea
> @@ -167,45 +170,6 @@ mcpu=
>  Target RejectNegative Joined Var(arc_cpu) Enum(processor_type) 
> Init(PROCESSOR_NONE)
>  -mcpu=CPU    Compile code for ARC variant CPU.
>  
> -Enum
> -Name(processor_type) Type(enum processor_type)
> -
> -EnumValue
> -Enum(processor_type) String(ARC600) Value(PROCESSOR_ARC600)
> -
> -EnumValue
> -Enum(processor_type) String(arc600) Value(PROCESSOR_ARC600)
> -
> -EnumValue
> -Enum(processor_type) String(ARC601) Value(PROCESSOR_ARC601)
> -
> -EnumValue
> -Enum(processor_type) String(arc601) Value(PROCESSOR_ARC601)
> -
> -EnumValue
> -Enum(processor_type) String(ARC700) Value(PROCESSOR_ARC700)
> -
> -EnumValue
> -Enum(processor_type) String(arc700) Value(PROCESSOR_ARC700)
> -
> -EnumValue
> -Enum(processor_type) String(nps400) Value(PROCESSOR_NPS400)
> -
> -EnumValue
> -Enum(processor_type) String(NPS400) Value(PROCESSOR_NPS400)
> -
> -EnumValue
> -Enum(processor_type) String(ARCEM) Value(PROCESSOR_ARCEM)
> -
> -EnumValue
> -Enum(processor_type) String(arcem) Value(PROCESSOR_ARCEM)
> -
> -EnumValue
> -Enum(processor_type) String(ARCHS) Value(PROCESSOR_ARCHS)
> -
> -EnumValue
> -Enum(processor_type) String(archs) Value(PROCESSOR_ARCHS)
> -
>  msize-level=
>  Target RejectNegative Joined UInteger Var(arc_size_opt_level) Init(-1)
>  size optimization level: 0:none 1:opportunistic 2: regalloc 3:drop align, 
> -Os.
> @@ -308,25 +272,25 @@ Expand adddi3 and subdi3 at rtl generation time into 
> add.f / adc etc.
>  ; Flags used by the assembler, but for which we define preprocessor
>  ; macro symbols as well.
>  mcrc
> -Target Report
> +Target Report Warn(%qs is deprecated)
>  Enable variable polynomial CRC extension.
>  
>  mdsp-packa
> -Target Report
> +Target Report Warn(%qs is deprecated)
>  Enable DSP 3.1 Pack A extensions.
>  
>  mdvbf
> -Target Report
> +Target Report Warn(%qs is deprecated)
>  Enable dual viterbi butterfly extension.
>  
>  mmac-d16
> -Target Report Undocumented
> +Target Report Undocumented Warn(%qs is deprecated)
>  
>  mmac-24
> -Target Report Undocumented
> +Target Report Undocumented Warn(%qs is deprecated)
>  
>  mtelephony
> -Target Report RejectNegative
> +Target Report RejectNegative Warn(%qs is deprecated)
>  Enable Dual and Single Operand Instructions for Telephony.
>  
>  mxy
> @@ -343,7 +307,7 @@ Target Report
>  Enable swap byte ordering extension instruction.
>  
>  mrtsc
> -Target Report
> +Target Report Warn(%qs is deprecated)
>  Enable 64-bit Time-Stamp Counter extension instruction.
>  
>  EB
> @@ -394,24 +358,6 @@ Target
>  multcost=
>  Target RejectNegative Joined
>  
> -; Unfortunately, listing the full option name gives us clashes
> -; with OPT_opt_name being claimed for both opt_name and opt-name,
> -; so we leave out the last character or more.
> -mbarrel_shifte
> -Target Joined
> -
> -mspfp_
> -Target Joined
> -
> -mdpfp_
> -Target Joined
> -
> -mdsp_pack
> -Target Joined
> -
> -mmac_
> -Target Joined
> -
>  matomic
>  Target Report Mask(ATOMIC)
>  Enable atomic instructions.
> @@ -421,47 +367,47 @@ Target Report Mask(LL64)
>  Enable double load/store instructions for ARC HS.
>  
>  mfpu=
> -Target RejectNegative Joined Enum(arc_fpu) Var(arc_fpu_build) Init(0)
> +Target RejectNegative Joined Enum(arc_fpu) Var(arc_fpu_build) 
> Init(DEFAULT_arc_fpu_build)
>  Specify the name of the target floating point configuration.
>  
>  Enum
>  Name(arc_fpu) Type(int)
>  
>  EnumValue
> -Enum(arc_fpu) String(fpus) Value(FPU_SP | FPU_SC)
> +Enum(arc_fpu) String(fpus) Value(FPU_FPUS)
>  
>  EnumValue
> -Enum(arc_fpu) String(fpud) Value(FPU_SP | FPU_SC | FPU_DP | FPU_DC)
> +Enum(arc_fpu) String(fpud) Value(FPU_FPUD)
>  
>  EnumValue
> -Enum(arc_fpu) String(fpuda) Value(FPU_SP | FPU_SC | FPX_DP)
> +Enum(arc_fpu) String(fpuda) Value(FPU_FPUDA)
>  
>  EnumValue
> -Enum(arc_fpu) String(fpuda_div) Value(FPU_SP | FPU_SC | FPU_SD | FPX_DP)
> +Enum(arc_fpu) String(fpuda_div) Value(FPU_FPUDA_DIV)
>  
>  EnumValue
> -Enum(arc_fpu) String(fpuda_fma) Value(FPU_SP | FPU_SC | FPU_SF | FPX_DP)
> +Enum(arc_fpu) String(fpuda_fma) Value(FPU_FPUDA_FMA)
>  
>  EnumValue
> -Enum(arc_fpu) String(fpuda_all) Value(FPU_SP | FPU_SC | FPU_SF | FPU_SD | 
> FPX_DP)
> +Enum(arc_fpu) String(fpuda_all) Value(FPU_FPUDA_ALL)
>  
>  EnumValue
> -Enum(arc_fpu) String(fpus_div) Value(FPU_SP | FPU_SC | FPU_SD)
> +Enum(arc_fpu) String(fpus_div) Value(FPU_FPUS_DIV)
>  
>  EnumValue
> -Enum(arc_fpu) String(fpud_div) Value(FPU_SP | FPU_SC | FPU_SD | FPU_DP | 
> FPU_DC | FPU_DD)
> +Enum(arc_fpu) String(fpud_div) Value(FPU_FPUD_DIV)
>  
>  EnumValue
> -Enum(arc_fpu) String(fpus_fma) Value(FPU_SP | FPU_SC | FPU_SF)
> +Enum(arc_fpu) String(fpus_fma) Value(FPU_FPUS_FMA)
>  
>  EnumValue
> -Enum(arc_fpu) String(fpud_fma) Value(FPU_SP | FPU_SC | FPU_SF | FPU_DP | 
> FPU_DC | FPU_DF)
> +Enum(arc_fpu) String(fpud_fma) Value(FPU_FPUD_FMA)
>  
>  EnumValue
> -Enum(arc_fpu) String(fpus_all) Value(FPU_SP | FPU_SC | FPU_SF | FPU_SD)
> +Enum(arc_fpu) String(fpus_all) Value(FPU_FPUS_ALL)
>  
>  EnumValue
> -Enum(arc_fpu) String(fpud_all) Value(FPU_SP | FPU_SC | FPU_SF | FPU_SD | 
> FPU_DP | FPU_DC | FPU_DF | FPU_DD)
> +Enum(arc_fpu) String(fpud_all) Value(FPU_FPUD_ALL)
>  
>  mtp-regno=
>  Target RejectNegative Joined UInteger Var(arc_tp_regno) Init(25)
> @@ -481,3 +427,6 @@ Enable use of NPS400 xld/xst extension.
>  munaligned-access
>  Target Report Var(unaligned_access) Init(UNALIGNED_ACCESS_DEFAULT)
>  Enable unaligned word and halfword accesses to packed data.
> +
> +TargetVariable
> +unsigned int arc_seen_options = 0
> diff --git a/gcc/config/arc/driver-arc.c b/gcc/config/arc/driver-arc.c
> new file mode 100644
> index 0000000..c51b708
> --- /dev/null
> +++ b/gcc/config/arc/driver-arc.c
> @@ -0,0 +1,80 @@
> +/* Subroutines for the gcc driver.
> +   Copyright (C) 2016 Free Software Foundation, Inc.
> +   Contributed by Claudiu Zissulescu <claz...@synopsys.com>
> +
> +   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/>.  */
> +
> +#include "config.h"
> +#include "system.h"
> +#include "coretypes.h"
> +#include "tm.h"
> +
> +/* Returns command line parameters to pass to as.  */
> +
> +const char*
> +arc_cpu_to_as (int argc, const char **argv)
> +{
> +  const char *name = NULL;
> +  const arc_cpu_t *arc_selected_cpu;
> +
> +  /* No argument, check what is the default cpu.  */
> +  if (argc == 0)
> +    {
> +      arc_selected_cpu = &arc_cpu_types[(int) TARGET_CPU_DEFAULT];
> +    }
> +  else
> +    {
> +      name = argv[0];
> +      for (arc_selected_cpu = arc_cpu_types; arc_selected_cpu->name;
> +        arc_selected_cpu++)
> +     {
> +       if (strcmp (arc_selected_cpu->name, name) == 0)
> +         break;
> +     }
> +    }
> +
> +  /* Checking the flags is only required with the old binutils
> +     tools.  */

I don't understand what this comment is telling me.

> +  switch (arc_selected_cpu->arch)
> +    {
> +    case BASE_ARCH_em:
> +      if (arc_selected_cpu->flags & FL_CD)
> +     name = "-mcode-density";
> +      else
> +     name = "";
> +      if (arc_selected_cpu->flags & FL_FPUDA)
> +     name = concat ("-mfpuda ", name, NULL);
> +      if (arc_selected_cpu->flags & FL_SPFP)
> +     name = concat ("-mspfp ", name, NULL);
> +      if (arc_selected_cpu->flags & FL_DPFP)
> +     name = concat ("-mdpfp ", name, NULL);
> +      return concat ("-mcpu=arcem ", name, NULL);
> +    case BASE_ARCH_hs:
> +      return "-mcpu=archs";
> +    case BASE_ARCH_700:
> +      return "-mcpu=arc700 -mEA";
> +    case BASE_ARCH_6xx:
> +      if (arc_selected_cpu->flags & FL_MUL64)
> +     return "-mcpu=arc600 -mmul64 -mnorm";
> +      if (arc_selected_cpu->flags & FL_MUL32x16)
> +     return "-mcpu=arc600 -mdsp-packa -mnorm";
> +      return "-mcpu=arc600 -mnorm";
> +    default:
> +      gcc_unreachable ();
> +    }
> +  return NULL;
> +}
> diff --git a/gcc/config/arc/genmultilib.awk b/gcc/config/arc/genmultilib.awk
> new file mode 100644
> index 0000000..5934f4f
> --- /dev/null
> +++ b/gcc/config/arc/genmultilib.awk
> @@ -0,0 +1,203 @@
> +# Copyright (C) 2016 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 file is using AVR's genmultilib.awk idea.
> +# Transform CPU Information from arc-cpu.def to a
> +# Representation that is understood by GCC's multilib Machinery.
> +#
> +# The Script works as a Filter from STDIN to STDOUT.
> +#
> +# FORMAT = "Makefile": Generate Makefile Snipet that sets some
> +#                      MULTILIB_* Variables as needed.
> +#
> +##################################################################
> +
> +BEGIN {
> +  FS ="[(, \t)]+"
> +  comment = 1
> +  n_cores = 0
> +  n_reuse = 0
> +}
> +
> +##################################################################
> +# Add some Comments to the generated Files and copy-paste
> +# Copyright Notice from above.
> +##################################################################
> +/^#/ {
> +  if (!comment)
> +    next
> +  else if (comment == 1)
> +    {
> +      if (FORMAT == "Makefile")
> +     {
> +       print "# Auto-generated Makefile Snip"
> +       print "# Generated by    : ./gcc/config/arc/genmultilib.awk"
> +       print "# Generated from  : ./gcc/config/arc/arc-cpu.def"
> +       print "# Used by         : tmake_file from Makefile and genmultilib"
> +       print ""
> +     }
> +    }
> +
> +  comment = 2;
> +
> +  print
> +}
> +
> +/^$/ {
> +  # The first empty line stops copy-pasting the GPL comments
> +  # from this file to the generated file.
> +
> +  comment = 0
> +}
> +
> +
> +/^ARC_CPU/ {
> +  name = $2
> +  #  gsub ("\"", "", name)
> +
> +  if ($4 != "0")
> +    {
> +      arch = $3
> +      if (arch == "6xx")
> +     arch = 601
> +
> +      n = split ($4, cpu_flg, "|")
> +
> +      line = "mcpu." arch
> +      for (i = 1; i <= n; i++)
> +     {
> +       if (cpu_flg[i] == "FL_MPYOPT_0")
> +         line = line "/mmpy-option.0"
> +       else if (cpu_flg[i] == "FL_MPYOPT_1")
> +         line = line "/mmpy-option.1"
> +       else if (cpu_flg[i] == "FL_MPYOPT_2")
> +         line = line "/mmpy-option.2"
> +       else if (cpu_flg[i] == "FL_MPYOPT_3")
> +         line = line "/mmpy-option.3"
> +       else if (cpu_flg[i] == "FL_MPYOPT_4")
> +         line = line "/mmpy-option.4"
> +       else if (cpu_flg[i] == "FL_MPYOPT_5")
> +         line = line "/mmpy-option.5"
> +       else if (cpu_flg[i] == "FL_MPYOPT_6")
> +         line = line "/mmpy-option.6"
> +       else if (cpu_flg[i] == "FL_MPYOPT_7")
> +         line = line "/mmpy-option.7"
> +       else if (cpu_flg[i] == "FL_MPYOPT_8")
> +         line = line "/mmpy-option.8"
> +       else if (cpu_flg[i] == "FL_MPYOPT_9")
> +         line = line "/mmpy-option.9"
> +       else if (cpu_flg[i] == "FL_CD")
> +         line = line "/mcode-density"
> +       else if (cpu_flg[i] == "FL_BS")
> +         line = line "/mbarrel-shifter"
> +       else if (cpu_flg[i] == "FL_DIVREM")
> +         line = line "/mdiv-rem"
> +       else if (cpu_flg[i] == "FL_NORM" \
> +                || cpu_flg[i] == "FL_SWAP")
> +         line = line "/mnorm"
> +       else if (cpu_flg[i] == "FL_FPU_FPUS")
> +         line = line "/mfpu.fpus"
> +       else if (cpu_flg[i] == "FL_FPU_FPUDA")
> +         line = line "/mfpu.fpuda"
> +       else if (cpu_flg[i] == "FL_FPU_FPUD_ALL")
> +         line = line "/mfpu.fpud_all"
> +       else if (cpu_flg[i] == "FL_LL64")
> +         line = line "/mll64"
> +       else if (cpu_flg[i] == "FL_MUL64")
> +         line = line "/mmul64"
> +       else if (cpu_flg[i] == "FL_MUL32x16")
> +         line = line "/mmul32x16"
> +       else if (cpu_flg[i] == "FL_FPX_QUARK")
> +         line = line "/quark"
> +       else if (cpu_flg[i] == "FL_SPFP")
> +         line = line "/spfp"
> +       else if (cpu_flg[i] == "FL_DPFP")
> +         line = line "/dpfp"
> +       else
> +         {
> +           print "Don't know the flag " cpu_flg[i] > "/dev/stderr"
> +           exit 1
> +         }
> +     }
> +      line = "mcpu." name "=" line
> +      reuse[n_reuse] = line
> +      n_reuse++
> +    }
> +
> +  core = name
> +  cores[n_cores] = core
> +  n_cores++
> +}
> +
> +##################################################################
> +#
> +# We gathered all the Information, now build/output the following:
> +#
> +#    awk Variable         target Variable          FORMAT
> +#  -----------------------------------------------------------
> +#    m_options     <->    MULTILIB_OPTIONS         Makefile
> +#    m_dirnames    <->    MULTILIB_DIRNAMES           "
> +#
> +##################################################################
> +
> +END {
> +  m_options    = "\nMULTILIB_OPTIONS = "
> +  m_dirnames   = "\nMULTILIB_DIRNAMES ="
> +  m_reuse      = "\nMULTILIB_REUSE ="
> +
> +  sep = ""
> +  for (c = 0; c < n_cores; c++)
> +    {
> +      m_options  = m_options sep "mcpu=" cores[c]
> +      m_dirnames = m_dirnames " " cores[c]
> +      sep = "/"
> +    }
> +
> +  sep = ""
> +  for (c = 0; c < n_reuse; c++)
> +    {
> +      m_reuse = m_reuse sep reuse[c]
> +      sep = "\nMULTILIB_REUSE +="
> +    }
> +  ############################################################
> +  # Output that Stuff
> +  ############################################################
> +
> +  if (FORMAT == "Makefile")
> +    {
> +      # Intended Target: ./gcc/config/arc/t-multilib
> +
> +      print m_options
> +      print m_dirnames
> +
> +      ############################################################
> +      # Legacy Aliases
> +      ############################################################
> +
> +      print ""
> +      print "# Aliases:"
> +      print "MULTILIB_MATCHES  = mcpu?arc600=mcpu?ARC600"
> +      print "MULTILIB_MATCHES += mcpu?arc600=mARC600"
> +      print "MULTILIB_MATCHES += mcpu?arc600=mA6"
> +      print "MULTILIB_MATCHES += mcpu?arc601=mcpu?ARC601"
> +      print "MULTILIB_MATCHES += mcpu?arc700=mA7"
> +      print "MULTILIB_MATCHES += mcpu?arc700=mARC700"
> +    }
> +}
> diff --git a/gcc/config/arc/genoptions.awk b/gcc/config/arc/genoptions.awk
> new file mode 100644
> index 0000000..24a93eb
> --- /dev/null
> +++ b/gcc/config/arc/genoptions.awk
> @@ -0,0 +1,86 @@
> +# Copyright (C) 2016 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 file is using AVR's genmultilib.awk idea.
> +#
> +##################################################################
> +
> +BEGIN {
> +  FS ="[(, \t)]+"
> +  comment = 1
> +  n_cores = 0
> +}
> +
> +##################################################################
> +# Add some Comments to the generated Files and copy-paste
> +# Copyright Notice from above.
> +##################################################################
> +/^#/ {
> +  if (!comment)
> +    next
> +  else if (comment == 1)
> +    {
> +      if (FORMAT == "Makefile")
> +     {
> +       print "; Auto-generated Makefile Snip"
> +       print "; Generated by    : ./gcc/config/arc/genoptions.awk"
> +       print "; Generated from  : ./gcc/config/arc/arc-cpu.def"
> +       print ";"
> +     }
> +    }
> +
> +  comment = 2;
> +
> +  gsub ("^#", ";", $0)
> +  print
> +}
> +
> +/^$/ {
> +    # The first empty line stops copy-pasting the GPL comments
> +    # from this file to the generated file.
> +    comment = 0
> +}
> +
> +/^ARC_CPU/ {
> +  name = $2
> +  cores[n_cores] = name;
> +  n_cores++
> +}
> +
> +END {
> +  m_option = ""
> +  for (c = 0; c < n_cores; c++)
> +    {
> +      m_options = m_options "EnumValue\nEnum(processor_type) String(" \
> +     cores[c] ") Value(PROCESSOR_" cores[c] ")\n\n"
> +    }
> +
> +  ############################################################
> +  # Output that Stuff
> +  ############################################################
> +
> +  if (FORMAT == "Makefile")
> +    {
> +     print "\nEnum"
> +     print "Name(processor_type) Type(enum processor_type)"
> +     print "Known ARC CPUs (for use with the -mcpu= option):\n"
> +     print m_options
> +    }
> +}
> diff --git a/gcc/config/arc/t-arc b/gcc/config/arc/t-arc
> index 4252e73..bdb1328 100644
> --- a/gcc/config/arc/t-arc
> +++ b/gcc/config/arc/t-arc
> @@ -19,11 +19,30 @@
>  
>  TM_H += $(srcdir)/config/arc/arc-c.def
>  
> +driver-arc.o: $(srcdir)/config/arc/driver-arc.c \
> +  $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H)
> +     $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
> +
>  arc-c.o: $(srcdir)/config/arc/arc-c.c $(CONFIG_H) $(SYSTEM_H) \
>  $(TREE_H) $(TM_H) $(TM_P_H) coretypes.h
>       $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
>               $(srcdir)/config/arc/arc-c.c
>  
> +#Run `arc-cpus` if you changed something in arc-cpus.def
> +
> +.PHONY: arc-cpus
> +
> +arc-cpus: $(srcdir)/config/arc/t-multilib \
> +     $(srcdir)/config/arc/arc-tables.opt
> +
> +$(srcdir)/config/arc/t-multilib: $(srcdir)/config/arc/genmultilib.awk        
> \
> +                              $(srcdir)/config/arc/arc-cpus.def
> +     $(AWK) -f $< -v FORMAT=Makefile $< $(srcdir)/config/arc/arc-cpus.def > 
> $@
> +
> +$(srcdir)/config/arc/arc-tables.opt: $(srcdir)/config/arc/genoptions.awk \
> +                              $(srcdir)/config/arc/arc-cpus.def
> +     $(AWK) -f $< -v FORMAT=Makefile $< $(srcdir)/config/arc/arc-cpus.def > 
> $@
> +
>  # Local Variables:
>  # mode: Makefile
>  # End:
> diff --git a/gcc/config/arc/t-arc-newlib b/gcc/config/arc/t-arc-newlib
> deleted file mode 100644
> index c49a3fcc..0000000
> --- a/gcc/config/arc/t-arc-newlib
> +++ /dev/null
> @@ -1,46 +0,0 @@
> -# GCC Makefile fragment for Synopsys DesignWare ARC with newlib.
> -
> -# Copyright (C) 2007-2016 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/>.
> -
> -MULTILIB_OPTIONS=mcpu=ARC600/mcpu=ARC601/mcpu=ARC700/mcpu=ARCEM/mcpu=ARCHS 
> mmul64/mmul32x16 mnorm
> -MULTILIB_DIRNAMES=arc600 arc601 arc700 em hs mul64 mul32x16 norm
> -#
> -# Aliases:
> -MULTILIB_MATCHES  = mcpu?ARC600=mcpu?arc600
> -MULTILIB_MATCHES += mcpu?ARC600=mARC600
> -MULTILIB_MATCHES += mcpu?ARC600=mA6
> -MULTILIB_MATCHES += mcpu?ARC600=mno-mpy
> -MULTILIB_MATCHES += mcpu?ARC601=mcpu?arc601
> -MULTILIB_MATCHES += mcpu?ARC700=mA7
> -MULTILIB_MATCHES += mcpu?ARC700=mARC700
> -MULTILIB_MATCHES += mcpu?ARC700=mcpu?arc700
> -MULTILIB_MATCHES += mcpu?ARCEM=mcpu?arcem
> -MULTILIB_MATCHES += mcpu?ARCHS=mcpu?archs
> -MULTILIB_MATCHES += EL=mlittle-endian
> -MULTILIB_MATCHES += EB=mbig-endian
> -#
> -# These don't make sense for the ARC700 default target:
> -MULTILIB_EXCEPTIONS=mmul64* mmul32x16* norm*
> -# And neither of the -mmul* options make sense without -mnorm:
> -MULTILIB_EXCLUSIONS=mARC600/mmul64/!mnorm mcpu=ARC601/mmul64/!mnorm 
> mARC600/mmul32x16/!mnorm
> -# Exclusions for ARC700
> -MULTILIB_EXCEPTIONS += mcpu=ARC700/mnorm* mcpu=ARC700/mmul64* 
> mcpu=ARC700/mmul32x16*
> -# Exclusions for ARCv2EM
> -MULTILIB_EXCEPTIONS += mcpu=ARCEM/mmul64* mcpu=ARCEM/mmul32x16*
> -# Exclusions for ARCv2HS
> -MULTILIB_EXCEPTIONS += mcpu=ARCHS/mmul64* mcpu=ARCHS/mmul32x16* 
> mcpu=ARCHS/mnorm*
> diff --git a/gcc/config/arc/t-arc-uClibc b/gcc/config/arc/t-arc-uClibc
> deleted file mode 100644
> index 11e81f1..0000000
> --- a/gcc/config/arc/t-arc-uClibc
> +++ /dev/null
> @@ -1,20 +0,0 @@
> -# GCC Makefile fragment for Synopsys DesignWare ARC with uClibc
> -
> -# Copyright (C) 2007-2016 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/>.
> -
> -MULTILIB_EXTRA_OPTS = mno-sdata
> diff --git a/gcc/config/arc/t-multilib b/gcc/config/arc/t-multilib
> new file mode 100644
> index 0000000..5a36af6
> --- /dev/null
> +++ b/gcc/config/arc/t-multilib
> @@ -0,0 +1,34 @@
> +# Auto-generated Makefile Snip
> +# Generated by    : ./gcc/config/arc/genmultilib.awk
> +# Generated from  : ./gcc/config/arc/arc-cpu.def
> +# Used by         : tmake_file from Makefile and genmultilib
> +
> +# Copyright (C) 2016 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/>.
> +
> +MULTILIB_OPTIONS = 
> mcpu=em/mcpu=arcem/mcpu=em4/mcpu=em4_dmips/mcpu=em4_fpus/mcpu=em4_fpuda/mcpu=hs/mcpu=archs/mcpu=hs34/mcpu=hs38/mcpu=hs38_linux/mcpu=arc600/mcpu=arc600_norm/mcpu=arc600_mul64/mcpu=arc600_mul32x16/mcpu=arc601/mcpu=arc601_norm/mcpu=arc601_mul64/mcpu=arc601_mul32x16/mcpu=arc700/mcpu=nps400
> +
> +MULTILIB_DIRNAMES = em arcem em4 em4_dmips em4_fpus em4_fpuda hs archs hs34 
> hs38 hs38_linux arc600 arc600_norm arc600_mul64 arc600_mul32x16 arc601 
> arc601_norm arc601_mul64 arc601_mul32x16 arc700 nps400
> +
> +# Aliases:
> +MULTILIB_MATCHES  = mcpu?arc600=mcpu?ARC600
> +MULTILIB_MATCHES += mcpu?arc600=mARC600
> +MULTILIB_MATCHES += mcpu?arc600=mA6
> +MULTILIB_MATCHES += mcpu?arc601=mcpu?ARC601
> +MULTILIB_MATCHES += mcpu?arc700=mA7
> +MULTILIB_MATCHES += mcpu?arc700=mARC700
> diff --git a/gcc/config/arc/t-uClibc b/gcc/config/arc/t-uClibc
> new file mode 100644
> index 0000000..11e81f1
> --- /dev/null
> +++ b/gcc/config/arc/t-uClibc
> @@ -0,0 +1,20 @@
> +# GCC Makefile fragment for Synopsys DesignWare ARC with uClibc
> +
> +# Copyright (C) 2007-2016 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/>.
> +
> +MULTILIB_EXTRA_OPTS = mno-sdata
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index 3f9c0a0..4399733 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -13882,29 +13882,92 @@ values for @var{cpu} are
>  @table @samp
>  @opindex mA6
>  @opindex mARC600
> -@item ARC600
>  @item arc600
>  Compile for ARC600.  Aliases: @option{-mA6}, @option{-mARC600}.
>  
> -@item ARC601
>  @item arc601
>  @opindex mARC601
>  Compile for ARC601.  Alias: @option{-mARC601}.
>  
> -@item ARC700
>  @item arc700
>  @opindex mA7
>  @opindex mARC700
>  Compile for ARC700.  Aliases: @option{-mA7}, @option{-mARC700}.
>  This is the default when configured with @option{--with-cpu=arc700}@.
>  
> -@item ARCEM
>  @item arcem
>  Compile for ARC EM.
>  
> -@item ARCHS
>  @item archs
>  Compile for ARC HS.
> +
> +@item em
> +@opindex em
> +Compile for ARC EM cpu with no hardware extension.
> +
> +@item em4
> +@opindex em4
> +Compile for ARC EM4 cpu.
> +
> +@item em4_dmips
> +@opindex em4_dmips
> +Compile for ARC EM4 DMIPS cpu.
> +
> +@item em4_fpus
> +@opindex em4_fpus
> +Compile for ARC EM4 DMIPS cpu with single precision floating point
> +extension.
> +
> +@item em4_fpuda
> +@opindex em4_fpuda
> +Compile for ARC EM4 DMIPS cpu with single precision floating point and
> +double assists instructions.
> +
> +@item hs
> +@opindex hs
> +Compile for ARC HS cpu with no hardware extension, except the atomic
> +instructions.
> +
> +@item hs34
> +@opindex hs34
> +Compile for ARC HS34 cpu.
> +
> +@item hs38
> +@opindex hs38
> +Compile for ARC HS38 cpu.
> +
> +@item hs38_linux
> +@opindex hs38_linux
> +Compile for ARC HS38 cpu with all hardware extensions on.
> +
> +@item arc600_norm
> +@opindex arc600_norm
> +Compile for ARC 600 cpu with norm instruction enabled.
> +
> +@item arc600_mul32x16
> +@opindex arc600_mul32x16
> +Compile for ARC 600 cpu with norm and mul32x16 instructions enabled.
> +
> +@item arc600_mul64
> +@opindex arc600_mul64
> +Compile for ARC 600 cpu with norm and mul64 instructions enabled.
> +
> +@item arc601_norm
> +@opindex arc601_norm
> +Compile for ARC 601 cpu with norm instruction enabled.
> +
> +@item arc601_mul32x16
> +@opindex arc601_mul32x16
> +Compile for ARC 601 cpu with norm and mul32x16 instructions enabled.
> +
> +@item arc601_mul64
> +@opindex arc601_mul64
> +Compile for ARC 601 cpu with norm and mul64 instructions enabled.
> +
> +@item nps400
> +@opindex nps400
> +Compile for ARC 700 on NPS400 chip.
> +
>  @end table
>  
>  @item -mdpfp
> @@ -13931,7 +13994,8 @@ supported.  This is always enabled for 
> @option{-mcpu=ARC700}.
>  
>  @item -mno-mpy
>  @opindex mno-mpy
> -Do not generate mpy instructions for ARC700.
> +Do not generate mpy instructions for ARC700.  This instruction is
> +deprecated.
>  
>  @item -mmul32x16
>  @opindex mmul32x16
> @@ -14138,12 +14202,14 @@ define preprocessor macro symbols.
>  @item -mdsp-packa
>  @opindex mdsp-packa
>  Passed down to the assembler to enable the DSP Pack A extensions.
> -Also sets the preprocessor symbol @code{__Xdsp_packa}.
> +Also sets the preprocessor symbol @code{__Xdsp_packa}.  This option is
> +deprecated.
>  
>  @item -mdvbf
>  @opindex mdvbf
>  Passed down to the assembler to enable the dual viterbi butterfly
> -extension.  Also sets the preprocessor symbol @code{__Xdvbf}.
> +extension.  Also sets the preprocessor symbol @code{__Xdvbf}.  This
> +option is deprecated.
>  
>  @c ARC700 4.10 extension instruction
>  @item -mlock
> @@ -14155,19 +14221,19 @@ Conditional extension.  Also sets the preprocessor 
> symbol
>  @item -mmac-d16
>  @opindex mmac-d16
>  Passed down to the assembler.  Also sets the preprocessor symbol
> -@code{__Xxmac_d16}.
> +@code{__Xxmac_d16}.  This option is deprecated.
>  
>  @item -mmac-24
>  @opindex mmac-24
>  Passed down to the assembler.  Also sets the preprocessor symbol
> -@code{__Xxmac_24}.
> +@code{__Xxmac_24}.  This option is deprecated.
>  
>  @c ARC700 4.10 extension instruction
>  @item -mrtsc
>  @opindex mrtsc
>  Passed down to the assembler to enable the 64-bit Time-Stamp Counter
>  extension instruction.  Also sets the preprocessor symbol
> -@code{__Xrtsc}.
> +@code{__Xrtsc}.  This option is deprecated.
>  
>  @c ARC700 4.10 extension instruction
>  @item -mswape
> @@ -14180,7 +14246,7 @@ extension instruction.  Also sets the preprocessor 
> symbol
>  @opindex mtelephony
>  Passed down to the assembler to enable dual and single operand
>  instructions for telephony.  Also sets the preprocessor symbol
> -@code{__Xtelephony}.
> +@code{__Xtelephony}.  This option is deprecated.
>  
>  @item -mxy
>  @opindex mxy
> -- 
> 1.9.1
> 

Reply via email to