diff mbox

[1/2,ARM] : New CPU support for Marvell Whitney

Message ID 54940573.20307@marvell.com
State New
Headers show

Commit Message

Xingxing Pan Dec. 19, 2014, 11:01 a.m. UTC
On 19/12/2014 18:38, Kyrill Tkachov wrote:
> Hi Xingxin,
>
> It seems that your mail client mangled this patch, at least the
> following hunk doesn't apply, even when I try to get it from the web
> archives.
> Could you please resend it as an attachment perhaps?
>
> Thanks,
> Kyrill
>
> On 18/12/14 10:13, Xingxing Pan wrote:
>> diff --git a/gcc/config/arm/arm-cores.def b/gcc/config/arm/arm-cores.def
>> index 423ee9e..b0ffbe1 100644
>> --- a/gcc/config/arm/arm-cores.def
>> +++ b/gcc/config/arm/arm-cores.def
>> @@ -159,6 +159,7 @@ ARM_CORE("cortex-m7",               cortexm7,
>> cortexm7,             7EM,
>> FL_LDSCHED, cortex_m7)
>>      ARM_CORE("cortex-m4",         cortexm4, cortexm4,             7EM,
>> FL_LDSCHED, v7m)
>>      ARM_CORE("cortex-m3",         cortexm3, cortexm3,             7M,
>> FL_LDSCHED, v7m)
>>      ARM_CORE("marvell-pj4",               marvell_pj4, marvell_pj4,
>>     7A,  FL_LDSCHED, 9e)
>> +ARM_CORE("marvell-whitney",            marvell_whitney, marvell_whitney,
>> 7A,  FL_LDSCHED | FL_THUMB_DIV | FL_ARM_DIV, marvell_whitney)
>
>

Hi Kyrill,

I've changed the code to use "tune" attribute directly. The new patch is 
attached.

Thanks,
Xingxing

Comments

Xingxing Pan Dec. 22, 2014, 12:11 p.m. UTC | #1
On 19/12/2014 19:01, Xingxing Pan wrote:
> On 19/12/2014 18:38, Kyrill Tkachov wrote:
>> Hi Xingxin,
>>
>> It seems that your mail client mangled this patch, at least the
>> following hunk doesn't apply, even when I try to get it from the web
>> archives.
>> Could you please resend it as an attachment perhaps?
>>
>> Thanks,
>> Kyrill
>>
>> On 18/12/14 10:13, Xingxing Pan wrote:
>>> diff --git a/gcc/config/arm/arm-cores.def b/gcc/config/arm/arm-cores.def
>>> index 423ee9e..b0ffbe1 100644
>>> --- a/gcc/config/arm/arm-cores.def
>>> +++ b/gcc/config/arm/arm-cores.def
>>> @@ -159,6 +159,7 @@ ARM_CORE("cortex-m7",               cortexm7,
>>> cortexm7,             7EM,
>>> FL_LDSCHED, cortex_m7)
>>>      ARM_CORE("cortex-m4",         cortexm4, cortexm4,             7EM,
>>> FL_LDSCHED, v7m)
>>>      ARM_CORE("cortex-m3",         cortexm3, cortexm3,             7M,
>>> FL_LDSCHED, v7m)
>>>      ARM_CORE("marvell-pj4",               marvell_pj4, marvell_pj4,
>>>     7A,  FL_LDSCHED, 9e)
>>> +ARM_CORE("marvell-whitney",            marvell_whitney,
>>> marvell_whitney,
>>> 7A,  FL_LDSCHED | FL_THUMB_DIV | FL_ARM_DIV, marvell_whitney)
>>
>>
>
> Hi Kyrill,
>
> I've changed the code to use "tune" attribute directly. The new patch is
> attached.
>
> Thanks,
> Xingxing

Any comments are welcome.

Thanks,
Xingxing
Kyrylo Tkachov Jan. 9, 2015, 11:22 a.m. UTC | #2
Hi Xingxing,

On 19/12/14 11:01, Xingxing Pan wrote:
> +/* Return true if vector element size is byte. */
Minor nit: two spaces after full stop and before */ Same in other places 
in the patch.

> +bool
> +marvell_whitney_vector_element_size_is_byte (rtx insn)
> +{
> +  if (GET_CODE (PATTERN (insn)) == SET)
> +    {
> +      if ((GET_MODE (SET_DEST (PATTERN (insn))) == V8QImode) ||
> +          (GET_MODE (SET_DEST (PATTERN (insn))) == V16QImode))
> +	return true;
> +    }
> +
> +  return false;
> +}

I see this is called from inside marvell-whitney.md. It seems to me that 
this function takes RTX insns. Can the type of this be strengthened to 
rtx_insn * ?
Also, this should be refactored and written a bit more generally by 
checking for VECTOR_MODE_P and then GET_MODE_INNER for QImode, saving 
you the trouble of enumerating the different vector QI modes.


> +
> +/* Return true if INSN has shift operation but is not a shift insn. */
> +bool
> +marvell_whitney_non_shift_with_shift_operand (rtx insn)

Similar comment. Can this be strengthened to rtx_insn * ?

Thanks,
Kyrill
> +{
> +  rtx pat = PATTERN (insn);
> +
> +  if (GET_CODE (pat) != SET)
> +    return false;
> +
> +  /* Is not a shift insn. */
> +  rtx rvalue = SET_SRC (pat);
> +  RTX_CODE code = GET_CODE (rvalue);
> +  if (code == ASHIFT || code == ASHIFTRT
> +      || code == LSHIFTRT || code == ROTATERT)
> +    return false;
> +
> +  subrtx_iterator::array_type array;
> +  FOR_EACH_SUBRTX (iter, array, rvalue, ALL)
> +    {
> +      /* Has shift operation. */
> +      RTX_CODE code = GET_CODE (*iter);
> +      if (code == ASHIFT || code == ASHIFTRT
> +          || code == LSHIFTRT || code == ROTATERT)
> +        return true;
> +    }
> +
> +  return false;
> +}
diff mbox

Patch

commit 56745b611d40b77e1911075159f89959335d0298
Author: Xingxing Pan <xxingpan@marvell.com>
Date:   Thu Dec 18 16:58:05 2014 +0800

    2014-12-18 Xingxing Pan <xxingpan@marvell.com>
    
        * config/arm/arm-cores.def: Add new core marvell-whitney.
        * config/arm/arm-protos.h:
        (marvell_whitney_vector_element_size_is_byte): Declare.
        (marvell_whitney_non_shift_with_shift_operand): Ditto.
        * config/arm/arm-tables.opt: Regenerated.
        * config/arm/arm-tune.md: Regenerated.
        * config/arm/arm.c (arm_marvell_whitney_tune): New structure.
        (arm_issue_rate): Add marvell_whitney.
        (marvell_whitney_vector_element_size_is_byte): New function.
        (marvell_whitney_non_shift_with_shift_operand): Ditto.
        * config/arm/arm.md: Include marvell-whitney.md.
        (generic_sched): Add marvell_whitney.
        (generic_vfp): Ditto.
        * config/arm/bpabi.h (BE8_LINK_SPEC): Add marvell-whitney.
        * config/arm/t-arm (MD_INCLUDES): Add marvell-whitney.md.
        * config/arm/marvell-whitney.md: New file.
        * doc/invoke.texi: Document marvell-whitney.

diff --git a/gcc/config/arm/arm-cores.def b/gcc/config/arm/arm-cores.def
index 423ee9e..b0ffbe1 100644
--- a/gcc/config/arm/arm-cores.def
+++ b/gcc/config/arm/arm-cores.def
@@ -159,6 +159,7 @@  ARM_CORE("cortex-m7",		cortexm7, cortexm7,		7EM, FL_LDSCHED, cortex_m7)
 ARM_CORE("cortex-m4",		cortexm4, cortexm4,		7EM, FL_LDSCHED, v7m)
 ARM_CORE("cortex-m3",		cortexm3, cortexm3,		7M,  FL_LDSCHED, v7m)
 ARM_CORE("marvell-pj4",		marvell_pj4, marvell_pj4,	7A,  FL_LDSCHED, 9e)
+ARM_CORE("marvell-whitney",		marvell_whitney, marvell_whitney,	        7A,  FL_LDSCHED | FL_THUMB_DIV | FL_ARM_DIV, marvell_whitney)
 
 /* V7 big.LITTLE implementations */
 ARM_CORE("cortex-a15.cortex-a7", cortexa15cortexa7, cortexa7,	7A,  FL_LDSCHED | FL_THUMB_DIV | FL_ARM_DIV, cortex_a15)
diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h
index 20cfa9f..e86db1e 100644
--- a/gcc/config/arm/arm-protos.h
+++ b/gcc/config/arm/arm-protos.h
@@ -231,6 +231,9 @@  extern void arm_order_regs_for_local_alloc (void);
 
 extern int arm_max_conditional_execute ();
 
+extern bool marvell_whitney_vector_element_size_is_byte (rtx insn);
+extern bool marvell_whitney_non_shift_with_shift_operand (rtx insn);
+
 /* Vectorizer cost model implementation.  */
 struct cpu_vec_costs {
   const int scalar_stmt_cost;   /* Cost of any scalar operation, excluding
diff --git a/gcc/config/arm/arm-tables.opt b/gcc/config/arm/arm-tables.opt
index 9b1886e..3371ce3 100644
--- a/gcc/config/arm/arm-tables.opt
+++ b/gcc/config/arm/arm-tables.opt
@@ -298,6 +298,9 @@  EnumValue
 Enum(processor_type) String(marvell-pj4) Value(marvell_pj4)
 
 EnumValue
+Enum(processor_type) String(marvell-whitney) Value(marvell_whitney)
+
+EnumValue
 Enum(processor_type) String(cortex-a15.cortex-a7) Value(cortexa15cortexa7)
 
 EnumValue
diff --git a/gcc/config/arm/arm-tune.md b/gcc/config/arm/arm-tune.md
index d300c51..c73c33c 100644
--- a/gcc/config/arm/arm-tune.md
+++ b/gcc/config/arm/arm-tune.md
@@ -28,9 +28,10 @@ 
 	cortexm1smallmultiply,cortexm0smallmultiply,cortexm0plussmallmultiply,
 	genericv7a,cortexa5,cortexa7,
 	cortexa8,cortexa9,cortexa12,
-	cortexa15,cortexa17,cortexr4,cortexr4f,
-	cortexr5,cortexr7,cortexm7,
-	cortexm4,cortexm3,marvell_pj4,
-	cortexa15cortexa7,cortexa17cortexa7,cortexa53,
-	cortexa57,cortexa57cortexa53"
+	cortexa15,cortexa17,cortexr4,
+	cortexr4f,cortexr5,cortexr7,
+	cortexm7,cortexm4,cortexm3,
+	marvell_pj4,marvell_whitney,cortexa15cortexa7,
+	cortexa17cortexa7,cortexa53,cortexa57,
+	cortexa57cortexa53"
 	(const (symbol_ref "((enum attr_tune) arm_tune)")))
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 0ec526b..183da4c 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -1914,6 +1914,25 @@  const struct tune_params arm_cortex_a9_tune =
   8						/* Maximum insns to inline memset.  */
 };
 
+const struct tune_params arm_marvell_whitney_tune =
+{
+  arm_9e_rtx_costs,
+  &cortexa9_extra_costs,
+  cortex_a9_sched_adjust_cost,
+  1,						/* Constant limit.  */
+  5,						/* Max cond insns.  */
+  ARM_PREFETCH_BENEFICIAL(4,32,32),
+  false,					/* Prefer constant pool.  */
+  arm_default_branch_cost,
+  false,					/* Prefer LDRD/STRD.  */
+  {true, true},					/* Prefer non short circuit.  */
+  &arm_default_vec_cost,                        /* Vectorizer costs.  */
+  false,                                        /* Prefer Neon for 64-bits bitops.  */
+  false, false,                                 /* Prefer 32-bit encodings.  */
+  false,					/* Prefer Neon for stringops.  */
+  8						/* Maximum insns to inline memset.  */
+};
+
 const struct tune_params arm_cortex_a12_tune =
 {
   arm_9e_rtx_costs,
@@ -11608,6 +11627,49 @@  fa726te_sched_adjust_cost (rtx_insn *insn, rtx link, rtx_insn *dep, int * cost)
   return true;
 }
 
+/* Return true if vector element size is byte. */
+bool
+marvell_whitney_vector_element_size_is_byte (rtx insn)
+{
+  if (GET_CODE (PATTERN (insn)) == SET)
+    {
+      if ((GET_MODE (SET_DEST (PATTERN (insn))) == V8QImode) ||
+          (GET_MODE (SET_DEST (PATTERN (insn))) == V16QImode))
+	return true;
+    }
+
+  return false;
+}
+
+/* Return true if INSN has shift operation but is not a shift insn. */
+bool
+marvell_whitney_non_shift_with_shift_operand (rtx insn)
+{
+  rtx pat = PATTERN (insn);
+
+  if (GET_CODE (pat) != SET)
+    return false;
+
+  /* Is not a shift insn. */
+  rtx rvalue = SET_SRC (pat);
+  RTX_CODE code = GET_CODE (rvalue);
+  if (code == ASHIFT || code == ASHIFTRT
+      || code == LSHIFTRT || code == ROTATERT)
+    return false;
+
+  subrtx_iterator::array_type array;
+  FOR_EACH_SUBRTX (iter, array, rvalue, ALL)
+    {
+      /* Has shift operation. */
+      RTX_CODE code = GET_CODE (*iter);
+      if (code == ASHIFT || code == ASHIFTRT
+          || code == LSHIFTRT || code == ROTATERT)
+        return true;
+    }
+
+  return false;
+}
+
 /* Implement TARGET_REGISTER_MOVE_COST.
 
    Moves between VFP_REGS and GENERAL_REGS are a single insn, but
@@ -27031,6 +27093,7 @@  arm_issue_rate (void)
     {
     case cortexa15:
     case cortexa57:
+    case marvell_whitney:
       return 3;
 
     case cortexm7:
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 822760b..8f02743 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -386,7 +386,8 @@ 
                                 arm926ejs,arm1020e,arm1026ejs,arm1136js,\
                                 arm1136jfs,cortexa5,cortexa7,cortexa8,\
                                 cortexa9,cortexa12,cortexa15,cortexa17,\
-                                cortexa53,cortexm4,cortexm7,marvell_pj4")
+                                cortexa53,cortexm4,cortexm7,marvell_pj4,\
+                                marvell_whitney")
 	       (eq_attr "tune_cortexr4" "yes"))
           (const_string "no")
           (const_string "yes"))))
@@ -396,7 +397,7 @@ 
 	  (and (eq_attr "fpu" "vfp")
 	       (eq_attr "tune" "!arm1020e,arm1022e,cortexa5,cortexa7,\
                                 cortexa8,cortexa9,cortexa53,cortexm4,\
-                                cortexm7,marvell_pj4")
+                                cortexm7,marvell_pj4,marvell_whitney")
 	       (eq_attr "tune_cortexr4" "no"))
 	  (const_string "yes")
 	  (const_string "no"))))
@@ -426,6 +427,7 @@ 
 (include "cortex-m4-fpu.md")
 (include "vfp11.md")
 (include "marvell-pj4.md")
+(include "marvell-whitney.md")
 
 
 ;;---------------------------------------------------------------------------
diff --git a/gcc/config/arm/bpabi.h b/gcc/config/arm/bpabi.h
index aa93aa4..07fab0f 100644
--- a/gcc/config/arm/bpabi.h
+++ b/gcc/config/arm/bpabi.h
@@ -68,6 +68,7 @@ 
    |mcpu=cortex-a15.cortex-a7				\
    |mcpu=cortex-a17.cortex-a7				\
    |mcpu=marvell-pj4					\
+   |mcpu=marvell-whitney				\
    |mcpu=cortex-a53					\
    |mcpu=cortex-a57					\
    |mcpu=cortex-a57.cortex-a53				\
@@ -96,6 +97,7 @@ 
    |mcpu=cortex-m0.small-multiply                       \
    |mcpu=cortex-m0plus.small-multiply                   \
    |mcpu=marvell-pj4					\
+   |mcpu=marvell-whitney				\
    |mcpu=generic-armv7-a                                \
    |march=armv7ve	                                \
    |march=armv7-m|mcpu=cortex-m3                        \
diff --git a/gcc/config/arm/marvell-whitney.md b/gcc/config/arm/marvell-whitney.md
new file mode 100644
index 0000000..7e0b2de
--- /dev/null
+++ b/gcc/config/arm/marvell-whitney.md
@@ -0,0 +1,678 @@ 
+;; Marvell ARM Processor Pipeline Description
+;; Copyright (C) 2011-2014 Free Software Foundation, Inc.
+;;
+;; Contributed by Marvell.
+
+;; 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/>.
+
+(define_attr "whitney_type"
+  "wTP1,wTP2,wTP3,wTP4,wTP5,wTP6,wTP7,wTP8,wTP9,wTP10,wTP11,wTP12,wTP13,\
+   wTP14,wTP15,wTP16,wTP17,wTP18,wTP19,wTP20,wTP21,wTP22,wTP23,wTP24,wTP25,\
+   wTP26,wTP27,wTP28,wTP29,wTP30,wTP31,wTP32,wTP33,wTP34,wTP35,wTP36,wTP37,\
+   wTP38,wTP39,wTP40,wTP41,wTP42,wTP43,wTP44,wTP45,wTP46,wTP47,wTP48,wTP49,\
+   wTP50,wTP51,wTP52,wTP53,wTP54,wTP55,wTP56,wTP57,wTP58,wTP59,\
+   unknown"
+  (cond [
+          (eq_attr "type" "alu_imm,alu_sreg,alus_imm,alus_sreg,adc_reg,\
+                           adc_imm,bfm,branch,call,clz,extend,logic_imm,\
+                           logic_reg,logics_imm,logics_reg,logics_shift_reg,\
+                           mov_imm,mov_reg,mvn_imm,mvn_reg,shift_imm,\
+                           shift_reg,rev")
+                          (const_string "wTP1")
+          (eq_attr "type" "alu_shift_imm,alu_shift_reg")
+                          (if_then_else (match_test
+                          "marvell_whitney_non_shift_with_shift_operand (insn)")
+                                      (const_string "wTP2")
+                                      (const_string "wTP1"))
+          (eq_attr "type" "alus_shift_imm,alus_shift_reg,mov_shift_reg,\
+                           mov_shift,mvn_shift_reg,mvn_shift,logic_shift_imm,\
+                           logic_shift_reg,multiple")
+                          (const_string "wTP2")
+          (eq_attr "type" "mla,mlas,mul,muls,smlal,smlalxy,smlaxy,smull,\
+                           smulxy,umlal,umull")
+                          (const_string "wTP3")
+          (eq_attr "type" "sdiv,udiv")
+                          (const_string "wTP4")
+          (eq_attr "type" "load1,load2,f_loads,f_loadd,load_byte")
+                          (const_string "wTP5")
+          (eq_attr "type" "neon_load2_one_lane,neon_load2_one_lane_q,\
+                           neon_load2_all_lanes,neon_load2_all_lanes_q,\
+                           neon_load2_2reg_q")
+                          (const_string "wTP7")
+          (eq_attr "type" "neon_load3_one_lane,neon_load3_one_lane_q,\
+                           neon_load3_3reg,neon_load3_3reg_q,\
+                           neon_load3_all_lanes,neon_load3_all_lanes_q")
+                          (const_string "wTP8")
+          (eq_attr "type" "neon_load4_one_lane,neon_load4_one_lane_q,\
+                           neon_load4_4reg,neon_load4_4reg_q,\
+                           neon_load4_all_lanes,neon_load4_all_lanes_q")
+                          (const_string "wTP9")
+          (eq_attr "type" "load3,load4,neon_load1_3reg,neon_load1_3reg_q,\
+                           neon_load1_4reg,neon_load1_4reg_q,neon_load1_4reg")
+                          (const_string "wTP10")
+          (eq_attr "type" "load2,neon_load1_1reg,neon_load1_1reg_q,\
+                           neon_load1_2reg,neon_load1_2reg_q,")
+                          (const_string "wTP11")
+          (eq_attr "type" "neon_load1_all_lanes,neon_load1_all_lanes_q,\
+                           neon_load1_one_lane,neon_load1_one_lane_q,")
+                           (const_string "wTP6")
+          (eq_attr "type" "f_stored,f_stores,store1,store2")
+                           (const_string "wTP12")
+          (eq_attr "type" "f_stored,neon_store1_3reg,neon_store1_3reg_q,\
+                           neon_store1_4reg,neon_store1_4reg_q,\
+                           neon_store2_4reg,neon_store2_4reg_q,\
+                           neon_store3_3reg,neon_store3_3reg_q,\
+                           neon_store3_one_lane,neon_store3_one_lane_q,\
+                           neon_store4_4reg,neon_store4_4reg_q,\
+                           neon_store4_one_lane,neon_store4_one_lane_q,\
+                           store3,store4")
+                           (const_string "wTP13")
+          (eq_attr "type" "neon_store1_1reg,neon_store1_1reg_q,\
+                           neon_store1_2reg,neon_store1_2reg_q,\
+                           neon_store1_one_lane,neon_store1_one_lane_q,\
+                           neon_store2_2reg,neon_store2_2reg_q,\
+                           neon_store2_one_lane,neon_store2_one_lane_q")
+                           (const_string "wTP14")
+          (eq_attr "type" "fmuld,fmuls,neon_fp_mul_s,neon_fp_mul_s_scalar")
+                           (const_string "wTP15")
+          (eq_attr "type" "neon_fp_mul_s_q,neon_fp_mul_s_scalar_q")
+                           (const_string "wTP16")
+          (eq_attr "type" "ffmad,ffmas,neon_fp_mla_s,neon_fp_round_s,\
+                           neon_fp_round_d")
+                           (const_string "wTP17")
+          (eq_attr "type" "neon_fp_mla_s_q,neon_fp_round_s_q,\
+                           neon_fp_round_d_q")
+                           (const_string "wTP18")
+          (eq_attr "type" "fmacd,fmacs,neon_fp_mla_s,neon_fp_mla_s_scalar,\
+                           neon_fp_recps_s,neon_fp_rsqrts_s")
+                           (const_string "wTP19")
+          (eq_attr "type" "neon_fp_mla_s_q,neon_fp_mla_s_scalar_q,\
+                           neon_fp_recps_s_q,neon_fp_rsqrts_s_q")
+                           (const_string "wTP20")
+          (eq_attr "type" "fconsts,fconstd,ffariths,ffarithd,fmov,\
+                           neon_fp_abs_s,neon_fp_neg_s")
+                           (const_string "wTP21")
+          (eq_attr "type" "neon_fp_abs_s_q,neon_fp_neg_s_q")
+                           (const_string "wTP22")
+          (eq_attr "type" "fcmpd,fcmps,neon_fp_minmax_s,neon_fp_compare_s,\
+                           neon_fp_reduc_minmax_s,neon_fp_reduc_minmax_d")
+                           (const_string "wTP23")
+          (eq_attr "type" "neon_fp_minmax_s_q,neon_fp_compare_s_q,\
+                           neon_fp_reduc_minmax_s_q,neon_fp_reduc_minmax_d_q")
+                           (const_string "wTP24")
+          (eq_attr "type" "f_cvt,f_cvtf2i,f_cvti2f,neon_fp_to_int_s,\
+                           neon_fp_to_int_d,neon_int_to_fp_s,neon_int_to_fp_d")
+                           (const_string "wTP25")
+          (eq_attr "type" "neon_fp_to_int_s_q,neon_fp_to_int_d_q,\
+                           neon_int_to_fp_s_q,neon_int_to_fp_d_q")
+                           (const_string "wTP26")
+          (eq_attr "type" "faddd,fadds,neon_fp_abd_s,neon_fp_addsub_s,\
+                           neon_fp_reduc_add_s")
+                           (const_string "wTP27")
+          (eq_attr "type" "neon_fp_abd_s_q,neon_fp_addsub_s_q,\
+                           neon_fp_reduc_add_s_q")
+                           (const_string "wTP28")
+          (eq_attr "type" "fdivs")
+                           (const_string "wTP29")
+          (eq_attr "type" "fsqrts")
+                           (const_string "wTP30")
+          (eq_attr "type" "fdivd")
+                           (const_string "wTP31")
+          (eq_attr "type" "fsqrtd")
+                           (const_string "wTP32")
+          (eq_attr "type" "neon_reduc_add_acc")
+                          (if_then_else (match_test
+                          "marvell_whitney_vector_element_size_is_byte (insn)")
+                                        (const_string "wTP33")
+                                        (const_string "wTP35"))
+          (eq_attr "type" "neon_reduc_add_acc_q")
+                          (if_then_else (match_test
+                          "marvell_whitney_vector_element_size_is_byte (insn)")
+                                        (const_string "wTP34")
+                                        (const_string "wTP36"))
+          (eq_attr "type" "neon_add,neon_qadd,neon_qsub,neon_reduc_add_long,\
+                           neon_reduc_add,neon_sub,neon_sub_halve")
+                          (if_then_else (match_test
+                          "marvell_whitney_vector_element_size_is_byte (insn)")
+                                        (const_string "wTP37")
+                                        (const_string "wTP39"))
+          (eq_attr "type" "neon_add_q,neon_qadd_q,neon_qsub_q,\
+                           neon_reduc_add_q,neon_sub_q,neon_sub_halve_q")
+                          (if_then_else (match_test
+                          "marvell_whitney_vector_element_size_is_byte (insn)")
+                                        (const_string "wTP38")
+                                        (const_string "wTP40"))
+          (eq_attr "type" "neon_add_halve,neon_add_long,neon_add_widen,\
+                           neon_compare,neon_compare_zero,neon_sub_long,\
+                           neon_sub_widen,neon_tst")
+                                        (const_string "wTP37")
+          (eq_attr "type" "neon_add_halve_q,neon_compare_q,\
+                           neon_compare_zero_q,neon_tst_q")
+                           (const_string "wTP38")
+          (eq_attr "type" "neon_add_halve_narrow_q,neon_sub_halve_narrow_q")
+                           (const_string "wTP40")
+          (eq_attr "type" "neon_permute,neon_tbl1,neon_tbl2,neon_tbl3,\
+                           neon_tbl4,neon_zip")
+                           (const_string "wTP41")
+          (eq_attr "type" "neon_permute_q,neon_zip_q")
+                           (const_string "wTP42")
+          (eq_attr "type" "neon_bsl,neon_logic")
+                           (const_string "wTP43")
+          (eq_attr "type" "neon_arith_acc,neon_shift_acc")
+                          (if_then_else (match_test
+                          "marvell_whitney_vector_element_size_is_byte (insn)")
+                                        (const_string "wTP43")
+                                        (const_string "wTP45"))
+          (eq_attr "type" "neon_arith_acc_q,neon_shift_acc_q")
+                          (if_then_else (match_test
+                          "marvell_whitney_vector_element_size_is_byte (insn)")
+                                        (const_string "wTP44")
+                                        (const_string "wTP46"))
+          (eq_attr "type" "neon_logic_q")
+                          (const_string "wTP44")
+          (eq_attr "type" "neon_cls,neon_cnt,neon_dup,neon_ext,\
+                           neon_fp_recpe_s,neon_fp_rsqrte_s,neon_minmax,\
+                           neon_move,neon_reduc_minmax,neon_rev")
+                          (const_string "wTP47")
+          (eq_attr "type" "neon_cls_q,neon_cnt_q,neon_dup_q,neon_ext_q,\
+                           neon_fp_recpe_s_q,neon_fp_rsqrte_s_q,neon_minmax_q,\
+                           neon_move_q,neon_move_narrow_q,neon_reduc_minmax_q,\
+                           neon_rev_q,neon_sat_shift_imm_narrow_q,\
+                           neon_shift_imm_narrow_q")
+                           (const_string "wTP48")
+          (eq_attr "type" "neon_abd_long,neon_abs,neon_neg,neon_qabs,\
+                           neon_qneg,neon_sat_shift_imm,neon_shift_imm_long,\
+                           neon_shift_imm,neon_shift_reg")
+                          (if_then_else (match_test
+                          "marvell_whitney_vector_element_size_is_byte (insn)")
+                                        (const_string "wTP47")
+                                        (const_string "wTP49"))
+          (eq_attr "type" "neon_abs_q,neon_neg_q,neon_qabs_q,neon_qneg_q,\
+                           neon_sat_shift_imm_q,neon_shift_imm_q,\
+                           neon_shift_reg_q")
+                          (if_then_else (match_test
+                          "marvell_whitney_vector_element_size_is_byte (insn)")
+                                        (const_string "wTP48")
+                                        (const_string "wTP50"))
+          (eq_attr "type" "neon_mul_b_long,neon_mul_h_long,neon_mul_s_long,\
+                           neon_sat_mul_b,neon_sat_mul_h,neon_sat_mul_s")
+                           (const_string "wTP51")
+          (eq_attr "type" "neon_sat_mul_b_q,neon_sat_mul_h_q,neon_sat_mul_s_q,\
+                           neon_mul_h_scalar_long,neon_mul_s_scalar_long,\
+                           neon_sat_mul_b_long,neon_sat_mul_h_long,\
+                           neon_sat_mul_s_long,neon_sat_mul_h_scalar_long,\
+                           neon_sat_mul_s_scalar_long,neon_sat_mul_h_scalar_q,\
+                           neon_sat_mul_s_scalar_q")
+                           (const_string "wTP52")
+          (eq_attr "type" "neon_mla_b,neon_mla_h,neon_mla_s,neon_mla_h_scalar,\
+                           neon_mla_s_scalar")
+                           (const_string "wTP53")
+          (eq_attr "type" "neon_mla_b_q,neon_mla_h_q,neon_mla_s_q,\
+                           neon_mla_h_scalar_q,neon_mla_s_scalar_q,\
+                           neon_mla_b_long,neon_mla_h_long,neon_mla_s_long,\
+                           neon_mla_h_scalar_long,neon_mla_s_scalar_long,\
+                           neon_sat_mla_b_long,neon_sat_mla_h_long,\
+                           neon_sat_mla_s_long,neon_sat_mla_h_scalar_long,\
+                           neon_sat_mla_s_scalar_long")
+                           (const_string "wTP54")
+          (eq_attr "type" "f_flag,f_mrc,f_mrrc")
+                           (const_string "wTP57")
+          (eq_attr "type" "neon_to_gp,neon_to_gp_q")
+                           (const_string "wTP55")
+          (eq_attr "type" "f_mcr,f_mcrr")
+                           (const_string "wTP58")
+          (eq_attr "type" "neon_from_gp_q")
+                           (const_string "wTP59")
+          (eq_attr "type" "neon_from_gp")
+                           (const_string "wTP56")]
+          (const_string "unknown")))
+
+(define_automaton "whitney_pipe")
+
+(define_cpu_unit "wCU1" "whitney_pipe")
+(define_cpu_unit "wCU2" "whitney_pipe")
+(define_cpu_unit "wCU3" "whitney_pipe")
+(define_cpu_unit "wCU4" "whitney_pipe")
+(define_cpu_unit "wCU5" "whitney_pipe")
+(define_cpu_unit "wCU6" "whitney_pipe")
+(define_cpu_unit "wCU7" "whitney_pipe")
+(define_cpu_unit "wCU8" "whitney_pipe")
+(define_cpu_unit "wCU9" "whitney_pipe")
+(define_cpu_unit "wCU10" "whitney_pipe")
+(define_cpu_unit "wCU11" "whitney_pipe")
+(define_cpu_unit "wCU12" "whitney_pipe")
+(define_cpu_unit "wCU13" "whitney_pipe")
+
+(define_insn_reservation "wIR1" 1
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP1"))
+  "wCU1|wCU2|(wCU3+wCU4)"
+)
+
+(define_insn_reservation "wIR2" 2
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP2"))
+  "wCU1|wCU2|(wCU3+wCU4)"
+)
+
+(define_insn_reservation "wIR3" 4
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP3"))
+  "(wCU1|wCU2|(wCU3+wCU4)), wCU8"
+)
+
+(define_insn_reservation "wIR4" 17
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP4"))
+  "(wCU1|wCU2|(wCU3+wCU4)), wCU7*8"
+)
+
+(define_insn_reservation "wIR5" 4
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP5"))
+  "(wCU1|wCU2|(wCU3+wCU4)), (wCU5|wCU6)"
+)
+
+(define_insn_reservation "wIR6" 0
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP12"))
+  "(wCU1|wCU2|(wCU3+wCU4)), wCU6"
+)
+
+(define_insn_reservation "wIR7" 8
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP6"))
+  "wCU1+wCU3+wCU4+wCU2,(wCU5|wCU6)"
+)
+
+(define_insn_reservation "wIR8" 8
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP7"))
+  "(wCU1+wCU3+wCU4+wCU2)*2,(wCU5|wCU6)"
+)
+
+(define_insn_reservation "wIR9" 9
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP8"))
+  "(wCU1+wCU3+wCU4+wCU2)*3,(wCU5|wCU6)"
+)
+
+(define_insn_reservation "wIR10" 9
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP9"))
+  "(wCU1+wCU3+wCU4+wCU2)*4,(wCU5|wCU6)"
+)
+
+(define_insn_reservation "wIR11" 4
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP10"))
+  "(wCU1+wCU3+wCU4+wCU2)*2,(wCU5|wCU6)"
+)
+
+(define_insn_reservation "wIR12" 4
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP11"))
+  "wCU1+wCU3+wCU4+wCU2,(wCU5|wCU6)"
+)
+
+(define_insn_reservation "wIR13" 0
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP13"))
+  "(wCU1+wCU3+wCU4+wCU2)*2,wCU6"
+)
+
+(define_insn_reservation "wIR14" 0
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP14"))
+  "wCU1+wCU3+wCU4+wCU2,wCU6"
+)
+
+(define_insn_reservation "wIR15" 6
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP15"))
+  "(wCU1|wCU2), wCU9"
+)
+
+(define_insn_reservation "wIR16" 6
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP16"))
+  "(wCU1+wCU2), wCU9*2"
+)
+
+(define_insn_reservation "wIR17" 6
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP17"))
+  "((wCU1+wCU3)|(wCU2+wCU4)), wCU9"
+)
+
+(define_insn_reservation "wIR18" 6
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP18"))
+  "(wCU1+wCU3+wCU2+wCU4), wCU9*2"
+)
+
+(define_insn_reservation "wIR19" 10
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP19"))
+  "(wCU1+wCU2), wCU9"
+)
+
+(define_insn_reservation "wIR20" 10
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP20"))
+  "(wCU1+wCU2)*2, wCU9"
+)
+
+(define_insn_reservation "wIR21" 3
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP21"))
+  "(wCU1|wCU2), wCU11"
+)
+
+(define_insn_reservation "wIR22" 3
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP22"))
+  "(wCU1+wCU2), wCU11*2"
+)
+
+(define_insn_reservation "wIR23" 4
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP23"))
+  "(wCU1|wCU2), wCU11"
+)
+
+(define_insn_reservation "wIR24" 4
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP24"))
+  "(wCU1+wCU2), wCU11*2"
+)
+
+(define_insn_reservation "wIR25" 4
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP25"))
+  "(wCU1|wCU2), wCU11"
+)
+
+(define_insn_reservation "wIR26" 4
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP26"))
+  "(wCU1+wCU2), wCU11*2"
+)
+
+(define_insn_reservation "wIR27" 4
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP27"))
+  "(wCU1|wCU2), wCU10"
+)
+
+(define_insn_reservation "wIR28" 4
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP28"))
+  "(wCU1+wCU2), wCU10*2"
+)
+
+(define_insn_reservation "wIR29" 16
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP29"))
+  "(wCU1|wCU2), wCU9, wCU12*8"
+)
+
+(define_insn_reservation "wIR30" 16
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP30"))
+  "(wCU1|wCU2), wCU9, wCU12*8"
+)
+
+(define_insn_reservation "wIR31" 26
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP31"))
+  "(wCU1|wCU2), wCU9, wCU12*8"
+)
+
+(define_insn_reservation "wIR32" 26
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP32"))
+  "(wCU1|wCU2), wCU9, wCU12*8"
+)
+
+(define_insn_reservation "wIR33" 3
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP33"))
+  "((wCU1+wCU3)|(wCU2+wCU4)), wCU10"
+)
+
+(define_insn_reservation "wIR34" 3
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP34"))
+  "(wCU1+wCU3+wCU2+wCU4), (wCU10+wCU11)"
+)
+
+(define_insn_reservation "wIR35" 3
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP35"))
+  "((wCU1+wCU3)|(wCU2+wCU4)), wCU10"
+)
+
+(define_insn_reservation "wIR36" 3
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP36"))
+  "(wCU1+wCU3+wCU2+wCU4), (wCU10+wCU11)"
+)
+
+(define_insn_reservation "wIR37" 3
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP37"))
+  "(wCU1|wCU2), wCU10"
+)
+
+(define_insn_reservation "wIR38" 3
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP38"))
+  "(wCU1+wCU2), (wCU10+wCU11)"
+)
+
+(define_insn_reservation "wIR39" 3
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP39"))
+  "(wCU1|wCU2), wCU10"
+)
+
+(define_insn_reservation "wIR40" 3
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP40"))
+  "(wCU1+wCU2), (wCU10+wCU11)"
+)
+
+(define_insn_reservation "wIR41" 4
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP41"))
+  "(wCU1+wCU3+wCU4+wCU2), wCU10*2"
+)
+
+(define_insn_reservation "wIR42" 4
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP42"))
+  "(wCU1+wCU3+wCU4+wCU2)*2, wCU10*3"
+)
+
+(define_insn_reservation "wIR43" 3
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP43"))
+  "((wCU1+wCU3)|(wCU4+wCU2)), wCU10"
+)
+
+(define_insn_reservation "wIR44" 3
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP44"))
+  "(wCU1+wCU3+wCU4+wCU2), (wCU10+wCU11)"
+)
+
+(define_insn_reservation "wIR45" 3
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP45"))
+  "((wCU1+wCU3)|(wCU4+wCU2)), wCU10"
+)
+
+(define_insn_reservation "wIR46" 3
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP46"))
+  "(wCU1+wCU3+wCU4+wCU2), (wCU10+wCU11)"
+)
+
+(define_insn_reservation "wIR47" 3
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP47"))
+  "(wCU1|wCU2), wCU10"
+)
+
+(define_insn_reservation "wIR48" 3
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP48"))
+  "(wCU1+wCU2), (wCU10+wCU11)"
+)
+
+(define_insn_reservation "wIR49" 3
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP49"))
+  "(wCU1|wCU2), wCU10"
+)
+
+(define_insn_reservation "wIR50" 3
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP50"))
+  "(wCU1+wCU2), (wCU10+wCU11)"
+)
+
+(define_insn_reservation "wIR51" 5
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP51"))
+  "(wCU1|wCU2), wCU9"
+)
+
+(define_insn_reservation "wIR52" 5
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP52"))
+  "(wCU1+wCU2), wCU9*2"
+)
+
+(define_insn_reservation "wIR53" 5
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP53"))
+  "((wCU1+wCU3)|(wCU2+wCU4)), wCU9"
+)
+
+(define_insn_reservation "wIR54" 5
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP54"))
+  "(wCU1+wCU3+wCU2+wCU4), wCU9*2"
+)
+
+(define_insn_reservation "wIR55" 3
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP55"))
+  "(wCU1|wCU2), wCU11"
+)
+
+(define_insn_reservation "wIR56" 2
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP56"))
+  "((wCU1+wCU3)|(wCU2+wCU4)), wCU11"
+)
+
+(define_insn_reservation "wIR57" 3
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP57"))
+  "(wCU1|wCU2), wCU11"
+)
+
+(define_insn_reservation "wIR58" 2
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP58"))
+  "((wCU1+wCU3)|(wCU2+wCU4)), wCU11"
+)
+
+(define_insn_reservation "wIR59" 2
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "wTP59"))
+  "(wCU1+wCU3+wCU2+wCU4), wCU11*2"
+)
+
+(define_insn_reservation "wIR60" 0
+  (and (eq_attr "tune" "marvell_whitney")
+       (eq_attr "whitney_type" "unknown"))
+  "wCU13"
+)
+
+(define_bypass 8 "wIR15" "wIR29, wIR31, wIR30, wIR32")
+(define_bypass 8 "wIR16" "wIR29, wIR31, wIR30, wIR32")
+(define_bypass 8 "wIR17" "wIR29, wIR31, wIR30, wIR32")
+(define_bypass 8 "wIR18" "wIR29, wIR31, wIR30, wIR32")
+(define_bypass 12 "wIR19" "wIR29, wIR31, wIR30, wIR32")
+(define_bypass 12 "wIR20" "wIR29, wIR31, wIR30, wIR32")
+(define_bypass 4 "wIR21" "wIR29, wIR31, wIR30, wIR32")
+(define_bypass 5 "wIR22" "wIR41")
+(define_bypass 6 "wIR22" "wIR42")
+(define_bypass 6 "wIR23" "wIR41, wIR42")
+(define_bypass 6 "wIR24" "wIR41")
+(define_bypass 7 "wIR24" "wIR42")
+(define_bypass 6 "wIR25" "wIR30, wIR32, wIR29, wIR31")
+(define_bypass 7 "wIR26" "wIR41")
+(define_bypass 8 "wIR26" "wIR42")
+(define_bypass 6 "wIR27" "wIR41, wIR42")
+(define_bypass 6 "wIR28" "wIR41, wIR42")
+(define_bypass 18 "wIR29" "wIR29, wIR30, wIR31, wIR32")
+(define_bypass 18 "wIR30" "wIR29, wIR30, wIR31, wIR32")
+(define_bypass 28 "wIR31" "wIR29, wIR30, wIR31, wIR32")
+(define_bypass 28 "wIR32" "wIR29, wIR30, wIR31, wIR32")
+(define_bypass 6 "wIR33" "wIR41, wIR42")
+(define_bypass 6 "wIR34" "wIR41")
+(define_bypass 7 "wIR34" "wIR42")
+(define_bypass 6 "wIR35" "wIR41, wIR42")
+(define_bypass 6 "wIR36" "wIR41")
+(define_bypass 7 "wIR36" "wIR42")
+(define_bypass 6 "wIR37" "wIR41, wIR42")
+(define_bypass 6 "wIR38" "wIR41")
+(define_bypass 7 "wIR38" "wIR42")
+(define_bypass 6 "wIR39" "wIR41, wIR42")
+(define_bypass 6 "wIR40" "wIR41")
+(define_bypass 7 "wIR40" "wIR42")
+(define_bypass 6 "wIR41" "wIR41, wIR42")
+(define_bypass 6 "wIR42" "wIR41")
+(define_bypass 7 "wIR42" "wIR42")
+(define_bypass 6 "wIR43" "wIR41, wIR42")
+(define_bypass 6 "wIR44" "wIR41")
+(define_bypass 7 "wIR44" "wIR42")
+(define_bypass 6 "wIR45" "wIR41, wIR42")
+(define_bypass 6 "wIR46" "wIR41")
+(define_bypass 7 "wIR46" "wIR42")
+(define_bypass 6 "wIR47" "wIR41, wIR42")
+(define_bypass 6 "wIR48" "wIR41")
+(define_bypass 7 "wIR48" "wIR42")
+(define_bypass 6 "wIR49" "wIR41, wIR42")
+(define_bypass 6 "wIR50" "wIR41")
+(define_bypass 7 "wIR50" "wIR42")
+(define_bypass 8 "wIR51" "wIR41, wIR42")
+(define_bypass 8 "wIR52" "wIR41")
+(define_bypass 9 "wIR52" "wIR42")
+(define_bypass 8 "wIR53" "wIR41, wIR42")
+(define_bypass 8 "wIR54" "wIR41")
+(define_bypass 9 "wIR54" "wIR42")
+(define_bypass 2 "wIR56" "wIR41, wIR42")
+(define_bypass 4 "wIR58" "wIR30, wIR32, wIR29, wIR31")
+(define_bypass 5 "wIR58" "wIR41, wIR42")
+(define_bypass 5 "wIR59" "wIR41")
+(define_bypass 6 "wIR59" "wIR42")
diff --git a/gcc/config/arm/t-arm b/gcc/config/arm/t-arm
index d82a123..8af9ad2 100644
--- a/gcc/config/arm/t-arm
+++ b/gcc/config/arm/t-arm
@@ -61,7 +61,8 @@  MD_INCLUDES=	$(srcdir)/config/arm/arm1020e.md \
 		$(srcdir)/config/arm/thumb2.md \
 		$(srcdir)/config/arm/vec-common.md \
 		$(srcdir)/config/arm/vfp11.md \
-		$(srcdir)/config/arm/vfp.md
+		$(srcdir)/config/arm/vfp.md \
+		$(srcdir)/config/arm/marvell-whitney.md
 
 s-config s-conditions s-flags s-codes s-constants s-emit s-recog s-preds \
 	s-opinit s-extract s-peep s-attr s-attrtab s-output: $(MD_INCLUDES)
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 15068da..c2522de 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -12869,6 +12869,7 @@  Permissible names are: @samp{arm2}, @samp{arm250},
 @samp{cortex-m0.small-multiply},
 @samp{cortex-m0plus.small-multiply},
 @samp{marvell-pj4},
+@samp{marvell-whitney},
 @samp{xscale}, @samp{iwmmxt}, @samp{iwmmxt2}, @samp{ep9312},
 @samp{fa526}, @samp{fa626},
 @samp{fa606te}, @samp{fa626te}, @samp{fmp626}, @samp{fa726te}.