/* ARC options.
   Copyright (C) 2016-2021 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/>.  */

/* List of all known ARC hardware modifier options (i.e., compiler
   options that are selecting a hardware facility).  There can be two
   types options: simple switches (e.g. code-density option can be
   on/off), or can accept multiple values (e.g., fpu options).

   For any valid HW option, define a macro:

   ARC_OPT (NAME, CODE, MASK, DOC)

   where:
   NAME	  Name (identifier) of a particular hardware modifier option,
	  as in enum cpu_flags.

   CODE	  64-bit mask used to encode NAME.

   MASK	  Corresponding GCC's MASK_<option> macro.

   DOC	  A string used when emitting compiler errors or warnings.

   For a multi-value option, define a macro for a valid value:

   ARC_OPTX (NAME, CODE, VAR, VAL, DOC)

   where:
   NAME	  Name (identifier) of a particular hardware modifier
	  configuration.

   CODE	  64-bit mask used to encode NAME.  It will be encoded in the
	  same variable like options given via ARC_OPT.

   VAR	  Corresponding GCC's option variable.

   VAL	  Value to be set in VAR.

   DOC	  A string used when emitting compiler errors or warnings.

   All multi-value options are defined using ARC_OPTX and ARC_OPT.
   ARC_OPT contains a mask with all valid values for the given
   option.  */

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_RF16,     (1ULL << 3), MASK_RF16,              "rf16")
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 arithmetic")
ARC_OPT (FL_SPFP,     (1ULL << 12), MASK_SPFP_COMPACT_SET, "single precision FPX")
ARC_OPT (FL_DPFP,     (1ULL << 13), MASK_DPFP_COMPACT_SET, "double precision 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_OPTX (FL_FPX_QUARK,	    (1ULL << 38), arc_fpu_build, FPX_QK,	"quarkse fp", "N.A.")

ARC_OPT (FL_FPUS,  (0xFULL << 26), 0, "single precision floating point")
ARC_OPT (FL_FPUDA, (0xFFULL << 26), 0, "double precision fp assist")
ARC_OPT (FL_FPUD,  (0xF0FULL << 26), 0, "double precision floating point")
ARC_OPT (FL_QUARK, (1ULL << 38), 0, "Quark SE fp extension")

/* Local Variables: */
/* mode: c */
/* End: */
