* Claudiu Zissulescu <claudiu.zissule...@synopsys.com> [2016-11-16 11:30:35 
+0100]:

> Updated QuarkSE patch.
> 
> Ok to apply?

Looks fine.

Thanks,
Andrew



> Claudiu
> 
> gcc/
> 2016-05-25  Claudiu Zissulescu  <claz...@synopsys.com>
> 
>       * config/arc/arc-arches.def: Add FPX quarkse instruction as valid
>       for arcem.
>       * config/arc/arc-c.def (__ARC_FPX_QUARK__): Define.
>       * config/arc/arc-cpus.def (quarkse_em): Add.
>       * config/arc/arc-options.def (FL_FPX_QUARK, FL_QUARK): Likewise.
>       * config/arc/arc-opts.h (FPX_QK): Define.
>       * config/arc/arc-tables.opt: Regenerate.
>       * config/arc/arc.c (gen_compare_reg): Change.
>       (arc_register_move_cost): Avoid Dy,Dx moves.
>       * config/arc/arc.h (TARGET_HARD_FLOAT): Change.
>       (TARGET_FPX_QUARK, TARGET_FP_ASSIST): Define.
>       * config/arc/arc.md (divsf3, sqrtsf2, fix_truncsfsi2, floatsisf2):
>       New expands.
>       * config/arc/fpu.md (divsf3_fpu, sqrtsf2_fpu, floatsisf2_fpu)
>       (fix_truncsfsi2_fpu): Rename.
>       * config/arc/fpx.md (cmp_quark, cmpsf_quark_, cmpsf_quark_ord)
>       (cmpsf_quark_uneq, cmpsf_quark_eq, divsf3_quark, sqrtsf2_quark)
>       (fix_truncsfsi2_quark, floatsisf2_quark): New patterns.
>       * config/arc/t-multilib: Regenerate.
> ---
>  gcc/config/arc/arc-arches.def  |  2 +-
>  gcc/config/arc/arc-c.def       |  1 +
>  gcc/config/arc/arc-cpus.def    |  1 +
>  gcc/config/arc/arc-options.def |  2 +
>  gcc/config/arc/arc-opts.h      |  2 +
>  gcc/config/arc/arc-tables.opt  |  3 ++
>  gcc/config/arc/arc.c           | 22 +++++++++-
>  gcc/config/arc/arc.h           | 12 +++--
>  gcc/config/arc/arc.md          | 46 ++++++++++++++++++++
>  gcc/config/arc/fpu.md          |  6 +--
>  gcc/config/arc/fpx.md          | 99 
> ++++++++++++++++++++++++++++++++++++++++++
>  gcc/config/arc/t-multilib      |  4 +-
>  12 files changed, 186 insertions(+), 14 deletions(-)
> 
> diff --git a/gcc/config/arc/arc-arches.def b/gcc/config/arc/arc-arches.def
> index f24babb..5fd45cd 100644
> --- a/gcc/config/arc/arc-arches.def
> +++ b/gcc/config/arc/arc-arches.def
> @@ -40,7 +40,7 @@
>  
>  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)
> +       | FL_SIMD | FL_FPUDA | FL_QUARK, 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,                                          \
> diff --git a/gcc/config/arc/arc-c.def b/gcc/config/arc/arc-c.def
> index 4cfd7b6..fd64376 100644
> --- a/gcc/config/arc/arc-c.def
> +++ b/gcc/config/arc/arc-c.def
> @@ -58,6 +58,7 @@ ARC_C_DEF ("__ARC_FPU_DP_DIV__", TARGET_FP_DP_SQRT)
>  ARC_C_DEF ("__ARC_FPU_SP_FMA__", TARGET_FP_SP_FUSED)
>  ARC_C_DEF ("__ARC_FPU_DP_FMA__", TARGET_FP_DP_FUSED)
>  ARC_C_DEF ("__ARC_FPU_ASSIST__", TARGET_FP_DP_AX)
> +ARC_C_DEF ("__ARC_FPX_QUARK__",  TARGET_FPX_QUARK)
>  
>  /* To be deprecated.  */
>  ARC_C_DEF ("__A6__",     TARGET_ARC600)
> diff --git a/gcc/config/arc/arc-cpus.def b/gcc/config/arc/arc-cpus.def
> index 0ceb734..7200485 100644
> --- a/gcc/config/arc/arc-cpus.def
> +++ b/gcc/config/arc/arc-cpus.def
> @@ -51,6 +51,7 @@ 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 (quarkse_em, em, 
> FL_MPYOPT_3|FL_CD|FL_DIVREM|FL_NORM|FL_SWAP|FL_BS|FL_FPX_QUARK|FL_SPFP|FL_DPFP,
>  NONE)
>  
>  ARC_CPU (hs,      hs, 0, NONE)
>  ARC_CPU (archs,           hs, FL_MPYOPT_2|FL_DIVREM|FL_LL64, NONE)
> diff --git a/gcc/config/arc/arc-options.def b/gcc/config/arc/arc-options.def
> index 0f9d36c..a16637e 100644
> --- a/gcc/config/arc/arc-options.def
> +++ b/gcc/config/arc/arc-options.def
> @@ -99,10 +99,12 @@ 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")
>  
>  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")
> +ARC_OPT (FL_QUARK, (1ULL << 38), 0, "Quark SE fp extension")
>  
>  /* Local Variables: */
>  /* mode: c */
> diff --git a/gcc/config/arc/arc-opts.h b/gcc/config/arc/arc-opts.h
> index e5bca84..2fd3c34 100644
> --- a/gcc/config/arc/arc-opts.h
> +++ b/gcc/config/arc/arc-opts.h
> @@ -48,6 +48,8 @@ enum processor_type
>  #define FPU_DD    0x0080
>  /* Double precision floating point assist operations.  */
>  #define FPX_DP    0x0100
> +/* Quark SE floating point instructions.  */
> +#define FPX_QK    0x0200
>  
>  /* fpus option combi.  */
>  #define FPU_FPUS  (FPU_SP | FPU_SC)
> diff --git a/gcc/config/arc/arc-tables.opt b/gcc/config/arc/arc-tables.opt
> index 0e7c50c..41e325c 100644
> --- a/gcc/config/arc/arc-tables.opt
> +++ b/gcc/config/arc/arc-tables.opt
> @@ -43,6 +43,9 @@ EnumValue
>  Enum(processor_type) String(em4_fpuda) Value(PROCESSOR_em4_fpuda)
>  
>  EnumValue
> +Enum(processor_type) String(quarkse_em) Value(PROCESSOR_quarkse_em)
> +
> +EnumValue
>  Enum(processor_type) String(hs) Value(PROCESSOR_hs)
>  
>  EnumValue
> diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
> index 3bce7ef..9f27474 100644
> --- a/gcc/config/arc/arc.c
> +++ b/gcc/config/arc/arc.c
> @@ -1726,6 +1726,26 @@ gen_compare_reg (rtx comparison, machine_mode omode)
>                                                gen_rtx_REG (CC_FPXmode, 61),
>                                                const0_rtx)));
>      }
> +  else if (TARGET_FPX_QUARK && (cmode == SFmode))
> +    {
> +      switch (code)
> +     {
> +     case NE: case EQ: case GT: case UNLE: case GE: case UNLT:
> +     case UNEQ: case LTGT: case ORDERED: case UNORDERED:
> +       break;
> +     case LT: case UNGE: case LE: case UNGT:
> +       code = swap_condition (code);
> +       tmp = x;
> +       x = y;
> +       y = tmp;
> +       break;
> +     default:
> +       gcc_unreachable ();
> +     }
> +
> +      emit_insn (gen_cmp_quark (cc_reg,
> +                             gen_rtx_COMPARE (mode, x, y)));
> +    }
>    else if (TARGET_HARD_FLOAT
>          && ((cmode == SFmode && TARGET_FP_SP_BASE)
>              || (cmode == DFmode && TARGET_FP_DP_BASE)))
> @@ -7281,7 +7301,7 @@ arc_register_move_cost (machine_mode,
>      return 8;
>  
>    /* Force an attempt to 'mov Dy,Dx' to spill.  */
> -  if (TARGET_ARC700 && TARGET_DPFP
> +  if ((TARGET_ARC700 || TARGET_EM) && TARGET_DPFP
>        && from_class == DOUBLE_REGS && to_class == DOUBLE_REGS)
>      return 100;
>  
> diff --git a/gcc/config/arc/arc.h b/gcc/config/arc/arc.h
> index 6188a4f..611ef54 100644
> --- a/gcc/config/arc/arc.h
> +++ b/gcc/config/arc/arc.h
> @@ -197,12 +197,7 @@ extern const char *arc_cpu_to_as (int argc, const char 
> **argv);
>     default for A7, and only for pre A7 cores when -mnorm is given.  */
>  #define TARGET_NORM (TARGET_ARC700 || TARGET_NORM_SET || TARGET_HS)
>  /* Indicate if an optimized floating point emulation library is available.  
> */
> -#define TARGET_OPTFPE                                \
> -   (TARGET_ARC700                            \
> -    /* We need a barrel shifter and NORM.  */        \
> -    || (TARGET_ARC600 && TARGET_NORM_SET)    \
> -    || TARGET_HS                             \
> -    || (TARGET_EM && TARGET_NORM_SET && TARGET_BARREL_SHIFTER))
> +#define TARGET_OPTFPE (TARGET_ARC700 || TARGET_FPX_QUARK)
>  
>  /* Non-zero means the cpu supports swap instruction.  This flag is set by
>     default for A7, and only for pre A7 cores when -mswap is given.  */
> @@ -1702,7 +1697,7 @@ enum
>  
>  /* FPU defines.  */
>  /* Any FPU support.  */
> -#define TARGET_HARD_FLOAT (arc_fpu_build != 0)
> +#define TARGET_HARD_FLOAT   ((arc_fpu_build & (FPU_SP | FPU_DP)) != 0)
>  /* Single precision floating point support.  */
>  #define TARGET_FP_SP_BASE   ((arc_fpu_build & FPU_SP) != 0)
>  /* Double precision floating point support.  */
> @@ -1721,5 +1716,8 @@ enum
>  #define TARGET_FP_DP_SQRT   ((arc_fpu_build & FPU_DD) != 0)
>  /* Double precision floating point assist instruction support.  */
>  #define TARGET_FP_DP_AX     ((arc_fpu_build & FPX_DP) != 0)
> +/* Custom FP instructions used by QuarkSE EM cpu.  */
> +#define TARGET_FPX_QUARK    (TARGET_EM && TARGET_SPFP                \
> +                          && (arc_fpu_build == FPX_QK))
>  
>  #endif /* GCC_ARC_H */
> diff --git a/gcc/config/arc/arc.md b/gcc/config/arc/arc.md
> index 429611e..4811f36 100644
> --- a/gcc/config/arc/arc.md
> +++ b/gcc/config/arc/arc.md
> @@ -5995,6 +5995,52 @@
>     gcc_unreachable ();
>   ")
>  
> +;;div
> +(define_expand "divsf3"
> +  [(set (match_operand:SF 0 "register_operand"        "")
> +     (div:SF (match_operand:SF 1 "nonmemory_operand" "")
> +             (match_operand:SF 2 "nonmemory_operand" "")))]
> +  "TARGET_FPX_QUARK || TARGET_FP_SP_SQRT"
> +  "
> +  if (TARGET_FPX_QUARK)
> +   {
> +     operands[1] = force_reg (SFmode, operands[1]);
> +     operands[2] = force_reg (SFmode, operands[2]);
> +   }
> +  else
> +   {
> +     if (!register_operand (operands[1], SFmode)
> +        && !register_operand (operands[2], SFmode))
> +       operands[1] = force_reg (SFmode, operands[1]);
> +   }
> +  ")
> +
> +;; Square root
> +(define_expand "sqrtsf2"
> +  [(set (match_operand:SF 0 "register_operand"           "")
> +     (sqrt:SF (match_operand:SF 1 "nonmemory_operand" "")))]
> +  "TARGET_FPX_QUARK || TARGET_FP_SP_SQRT"
> +  "
> +  if (TARGET_FPX_QUARK)
> +   {
> +     operands[1] = force_reg (SFmode, operands[1]);
> +   }
> +")
> +
> +;; SF->SI (using rounding towards zero)
> +(define_expand "fix_truncsfsi2"
> +  [(set (match_operand:SI 0 "register_operand"                "")
> +     (fix:SI (fix:SF (match_operand:SF 1 "register_operand" ""))))]
> +  "TARGET_FPX_QUARK || TARGET_FP_SP_CONV"
> +  "")
> +
> +;; SI->SF
> +(define_expand "floatsisf2"
> +  [(set (match_operand:SF 0 "register_operand"            "")
> +     (float:SF (match_operand:SI 1 "register_operand" "")))]
> +  "TARGET_FPX_QUARK || TARGET_FP_SP_CONV"
> +  "")
> +
>  (define_expand "extzv"
>    [(set (match_operand:SI 0 "register_operand" "")
>       (zero_extract:SI (match_operand:SI 1 "register_operand" "")
> diff --git a/gcc/config/arc/fpu.md b/gcc/config/arc/fpu.md
> index e43047c..5c56f76 100644
> --- a/gcc/config/arc/fpu.md
> +++ b/gcc/config/arc/fpu.md
> @@ -215,7 +215,7 @@
>  ;; see pattern in arc.md
>  
>  ;; Square root
> -(define_insn "sqrtsf2"
> +(define_insn "sqrtsf2_fpu"
>    [(set (match_operand:SF 0 "register_operand"           "=r,r")
>       (sqrt:SF (match_operand:SF 1 "nonmemory_operand"  "r,F")))]
>    "TARGET_FP_SP_SQRT"
> @@ -412,7 +412,7 @@
>  )
>  
>  ;; SI->SF
> -(define_insn "floatsisf2"
> +(define_insn "floatsisf2_fpu"
>    [(set (match_operand:SF 0 "register_operand"           "=r,r")
>       (float:SF (match_operand:SI 1 "register_operand"  "0,r")))]
>    "TARGET_FP_SP_CONV"
> @@ -448,7 +448,7 @@
>  )
>  
>  ;; SF->SI (using rounding towards zero)
> -(define_insn "fix_truncsfsi2"
> +(define_insn "fix_truncsfsi2_fpu"
>    [(set (match_operand:SI 0 "register_operand"                "=r,r")
>       (fix:SI (fix:SF (match_operand:SF 1 "register_operand" "0,r"))))]
>    "TARGET_FP_SP_CONV"
> diff --git a/gcc/config/arc/fpx.md b/gcc/config/arc/fpx.md
> index 9ed2b7c..094319e 100644
> --- a/gcc/config/arc/fpx.md
> +++ b/gcc/config/arc/fpx.md
> @@ -614,3 +614,102 @@
>   [(set_attr "type" "dpfp_addsub")
>    (set_attr "length" "4,8,4,8")
>    (set_attr "cpu_facility" "*,*,fpx,fpx")])
> +
> +;; Intel QUARK SE extensions
> +(define_mode_iterator QUARK_CMP [CC_FP_GT CC_FP_GE])
> +(define_mode_attr quark_cmp [(CC_FP_GT "gt") (CC_FP_GE "ge")])
> +
> +(define_expand "cmp_quark"
> +  [(parallel [(set (match_operand 0 "")
> +                (match_operand 1 ""))
> +           (clobber (match_scratch:SI 2 ""))])]
> +  ""
> +  "")
> +
> +(define_insn "*cmpsf_quark_<quark_cmp>"
> +  [(set (reg:QUARK_CMP CC_REG)
> +     (compare:QUARK_CMP (match_operand:SF 0 "register_operand" "r")
> +                        (match_operand:SF 1 "register_operand" "r")))
> +   (clobber (match_scratch:SI 2 "=&r"))]
> +  "TARGET_FPX_QUARK"
> +  
> "dsp_fp_cmp\\t%2,%0,%1\\n\\trsub.f\\t0,%2,7\\n\\tcmp.nc\\t%2,1\\n\\tcmp.hi\\t%2,3"
> +  [(set_attr "length" "16")
> +   (set_attr "cond" "set")
> +   (set_attr "predicable" "no")
> +   (set_attr "cond" "nocond")])
> +
> +(define_insn "*cmpsf_quark_ord"
> +  [(set (reg:CC_FP_ORD CC_REG)
> +     (compare:CC_FP_ORD (match_operand:SF 0 "register_operand" "r")
> +                        (match_operand:SF 1 "register_operand" "r")))
> +   (clobber (match_scratch:SI 2 "=&r"))]
> +  "TARGET_FPX_QUARK"
> +  "dsp_fp_cmp\\t%2,%0,%1\\n\\tadd.f\\t%2,%2,-8"
> +  [(set_attr "length" "8")
> +   (set_attr "cond" "set")
> +   (set_attr "predicable" "no")
> +   (set_attr "cond" "nocond")])
> +
> +(define_insn "*cmpsf_quark_uneq"
> +  [(set (reg:CC_FP_UNEQ CC_REG)
> +     (compare:CC_FP_UNEQ (match_operand:SF 0 "register_operand" "r")
> +                         (match_operand:SF 1 "register_operand" "r")))
> +   (clobber (match_scratch:SI 2 "=&r"))]
> +  "TARGET_FPX_QUARK"
> +  "dsp_fp_cmp\\t%2,%0,%1\\n\\ttst\\t%2,6"
> +  [(set_attr "length" "8")
> +   (set_attr "cond" "set")
> +   (set_attr "predicable" "no")
> +   (set_attr "cond" "nocond")])
> +
> +(define_insn "*cmpsf_quark_eq"
> +  [(set (reg:CC_Z CC_REG)
> +     (compare:CC_Z (match_operand:SF 0 "register_operand" "r")
> +                   (match_operand:SF 1 "register_operand" "r")))
> +   (clobber (match_scratch:SI 2 "=&r"))]
> +  "TARGET_FPX_QUARK"
> +  "dsp_fp_cmp\\t%2,%0,%1\\n\\ttst\\t%2,0x0E"
> +  [(set_attr "length" "8")
> +   (set_attr "cond" "set")
> +   (set_attr "predicable" "no")
> +   (set_attr "cond" "nocond")])
> +
> +(define_insn "*divsf3_quark"
> +  [(set (match_operand:SF 0 "register_operand"        "=r")
> +     (div:SF (match_operand:SF 1 "register_operand" "r")
> +             (match_operand:SF 2 "register_operand" "r")))]
> +  "TARGET_FPX_QUARK"
> +  "dsp_fp_div\\t%0,%1,%2"
> +  [(set_attr "length" "4")
> +   (set_attr "predicable" "no")
> +   (set_attr "cond" "nocond")])
> +
> +(define_insn "*sqrtsf2_quark"
> +  [(set (match_operand:SF 0 "register_operand"          "=r")
> +     (sqrt:SF (match_operand:SF 1 "register_operand" "r")))]
> +  "TARGET_FPX_QUARK"
> +  "dsp_fp_sqrt\\t%0,%1"
> +  [(set_attr "length" "4")
> +   (set_attr "predicable" "no")
> +   (set_attr "cond" "nocond")])
> +
> +;; SF->SI (using rounding towards zero)
> +(define_insn "*fix_truncsfsi2_quark"
> +  [(set (match_operand:SI 0 "register_operand"                "=r")
> +     (fix:SI (fix:SF (match_operand:SF 1 "register_operand" "r"))))]
> +  "TARGET_FPX_QUARK"
> +  "dsp_fp_flt2i\\t%0,%1"
> +  [(set_attr "length" "4")
> +   (set_attr "predicable" "no")
> +   (set_attr "cond" "nocond")])
> +
> +;; SI->SF
> +(define_insn "*floatsisf2_quark"
> +  [(set (match_operand:SF 0 "register_operand"          "=r")
> +     (float:SF (match_operand:SI 1 "register_operand" "r")))]
> +  "TARGET_FPX_QUARK"
> +  "dsp_fp_i2flt\\t%0,%1"
> +  [(set_attr "length" "4")
> +   (set_attr "predicable" "no")
> +   (set_attr "cond" "nocond")])
> +
> diff --git a/gcc/config/arc/t-multilib b/gcc/config/arc/t-multilib
> index 5a36af6..a964330 100644
> --- a/gcc/config/arc/t-multilib
> +++ b/gcc/config/arc/t-multilib
> @@ -21,9 +21,9 @@
>  # 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_OPTIONS = 
> mcpu=em/mcpu=arcem/mcpu=em4/mcpu=em4_dmips/mcpu=em4_fpus/mcpu=em4_fpuda/mcpu=quarkse_em/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
> +MULTILIB_DIRNAMES = em arcem em4 em4_dmips em4_fpus em4_fpuda quarkse_em 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
> -- 
> 1.9.1
> 

Reply via email to