On 29 May 2012 05:13, Matt Turner <matts...@gmail.com> wrote: > From: Xinyu Qi <x...@marvell.com> > > gcc/ > * config/arm/arm.c (FL_IWMMXT2): New define. > (arm_arch_iwmmxt2): New variable. > (arm_option_override): Enable use of iWMMXt with VFP. > Disable use of iWMMXt with NEON. Disable use of iWMMXt under > Thumb mode. Set arm_arch_iwmmxt2. > (arm_expand_binop_builtin): Accept VOIDmode op. > * config/arm/arm.h (TARGET_CPU_CPP_BUILTINS): Define __IWMMXT2__. > (TARGET_IWMMXT2): New define. > (TARGET_REALLY_IWMMXT2): Likewise. > (arm_arch_iwmmxt2): Declare. > * config/arm/arm-cores.def (iwmmxt2): Add FL_IWMMXT2. > * config/arm/arm-arches.def (iwmmxt2): Likewise. > * config/arm/arm.md (arch): Add "iwmmxt2". > (arch_enabled): Handle "iwmmxt2". > --- > gcc/config/arm/arm-arches.def | 2 +- > gcc/config/arm/arm-cores.def | 2 +- > gcc/config/arm/arm.c | 25 +++++++++++++++++-------- > gcc/config/arm/arm.h | 7 +++++++ > gcc/config/arm/arm.md | 6 +++++- > 5 files changed, 31 insertions(+), 11 deletions(-) > > diff --git a/gcc/config/arm/arm-arches.def b/gcc/config/arm/arm-arches.def > index 3123426..f4dd6cc 100644 > --- a/gcc/config/arm/arm-arches.def > +++ b/gcc/config/arm/arm-arches.def > @@ -57,4 +57,4 @@ ARM_ARCH("armv7-m", cortexm3, 7M, FL_CO_PROC | > FL_FOR_ARCH7M) > ARM_ARCH("armv7e-m", cortexm4, 7EM, FL_CO_PROC | FL_FOR_ARCH7EM) > ARM_ARCH("ep9312", ep9312, 4T, FL_LDSCHED | FL_CIRRUS | FL_FOR_ARCH4) > ARM_ARCH("iwmmxt", iwmmxt, 5TE, FL_LDSCHED | FL_STRONG | FL_FOR_ARCH5TE > | FL_XSCALE | FL_IWMMXT) > -ARM_ARCH("iwmmxt2", iwmmxt2, 5TE, FL_LDSCHED | FL_STRONG | FL_FOR_ARCH5TE > | FL_XSCALE | FL_IWMMXT) > +ARM_ARCH("iwmmxt2", iwmmxt2, 5TE, FL_LDSCHED | FL_STRONG | FL_FOR_ARCH5TE > | FL_XSCALE | FL_IWMMXT | FL_IWMMXT2) > diff --git a/gcc/config/arm/arm-cores.def b/gcc/config/arm/arm-cores.def > index d82b10b..c82eada 100644 > --- a/gcc/config/arm/arm-cores.def > +++ b/gcc/config/arm/arm-cores.def > @@ -105,7 +105,7 @@ ARM_CORE("arm1020e", arm1020e, 5TE, > FL_LDSCHED, fastmul) > ARM_CORE("arm1022e", arm1022e, 5TE, > FL_LDSCHED, fastmul) > ARM_CORE("xscale", xscale, 5TE, > FL_LDSCHED | FL_STRONG | FL_XSCALE, xscale) > ARM_CORE("iwmmxt", iwmmxt, 5TE, > FL_LDSCHED | FL_STRONG | FL_XSCALE | FL_IWMMXT, xscale) > -ARM_CORE("iwmmxt2", iwmmxt2, 5TE, > FL_LDSCHED | FL_STRONG | FL_XSCALE | FL_IWMMXT, xscale) > +ARM_CORE("iwmmxt2", iwmmxt2, 5TE, > FL_LDSCHED | FL_STRONG | FL_XSCALE | FL_IWMMXT | FL_IWMMXT2, xscale) > ARM_CORE("fa606te", fa606te, 5TE, > FL_LDSCHED, 9e) > ARM_CORE("fa626te", fa626te, 5TE, > FL_LDSCHED, 9e) > ARM_CORE("fmp626", fmp626, 5TE, > FL_LDSCHED, 9e) > diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c > index 7a98197..b0680ab 100644 > --- a/gcc/config/arm/arm.c > +++ b/gcc/config/arm/arm.c > @@ -685,6 +685,7 @@ static int thumb_call_reg_needed; > #define FL_ARM_DIV (1 << 23) /* Hardware divide (ARM mode). > */ > > #define FL_IWMMXT (1 << 29) /* XScale v2 or "Intel Wireless > MMX technology". */ > +#define FL_IWMMXT2 (1 << 30) /* "Intel Wireless MMX2 technology". > */ > > /* Flags that only effect tuning, not available instructions. */ > #define FL_TUNE (FL_WBUF | FL_VFPV2 | FL_STRONG | FL_LDSCHED \ > @@ -766,6 +767,9 @@ int arm_arch_cirrus = 0; > /* Nonzero if this chip supports Intel Wireless MMX technology. */ > int arm_arch_iwmmxt = 0; > > +/* Nonzero if this chip supports Intel Wireless MMX2 technology. */ > +int arm_arch_iwmmxt2 = 0; > + > /* Nonzero if this chip is an XScale. */ > int arm_arch_xscale = 0; > > @@ -1717,6 +1721,7 @@ arm_option_override (void) > arm_tune_wbuf = (tune_flags & FL_WBUF) != 0; > arm_tune_xscale = (tune_flags & FL_XSCALE) != 0; > arm_arch_iwmmxt = (insn_flags & FL_IWMMXT) != 0; > + arm_arch_iwmmxt2 = (insn_flags & FL_IWMMXT2) != 0; > arm_arch_thumb_hwdiv = (insn_flags & FL_THUMB_DIV) != 0; > arm_arch_arm_hwdiv = (insn_flags & FL_ARM_DIV) != 0; > arm_tune_cortex_a9 = (arm_tune == cortexa9) != 0; > @@ -1817,14 +1822,17 @@ arm_option_override (void) > } > > /* FPA and iWMMXt are incompatible because the insn encodings overlap. > - VFP and iWMMXt can theoretically coexist, but it's unlikely such silicon > - will ever exist. GCC makes no attempt to support this combination. */ > - if (TARGET_IWMMXT && !TARGET_SOFT_FLOAT) > - sorry ("iWMMXt and hardware floating point"); > + VFP and iWMMXt however can coexist. */ > + if (TARGET_IWMMXT && TARGET_HARD_FLOAT && !TARGET_VFP) > + error ("iWMMXt and non-VFP floating point unit are incompatible"); > + > + /* iWMMXt and NEON are incompatible. */ > + if (TARGET_IWMMXT && TARGET_NEON) > + error ("iWMMXt and NEON are incompatible"); > > - /* ??? iWMMXt insn patterns need auditing for Thumb-2. */ > - if (TARGET_THUMB2 && TARGET_IWMMXT) > - sorry ("Thumb-2 iWMMXt"); > + /* iWMMXt unsupported under Thumb mode. */ > + if (TARGET_THUMB && TARGET_IWMMXT) > + error ("iWMMXt unsupported under Thumb mode"); > > /* __fp16 support currently assumes the core has ldrh. */ > if (!arm_arch4 && arm_fp16_format != ARM_FP16_FORMAT_NONE) > @@ -20867,7 +20875,8 @@ arm_expand_binop_builtin (enum insn_code icode, > || ! (*insn_data[icode].operand[0].predicate) (target, tmode)) > target = gen_reg_rtx (tmode); > > - gcc_assert (GET_MODE (op0) == mode0 && GET_MODE (op1) == mode1); > + gcc_assert ((GET_MODE (op0) == mode0 || GET_MODE (op0) == VOIDmode) > + && (GET_MODE (op1) == mode1 || GET_MODE (op1) == VOIDmode)); > > if (! (*insn_data[icode].operand[1].predicate) (op0, mode0)) > op0 = copy_to_mode_reg (mode0, op0); > diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h > index f4204e4..c51bce9 100644 > --- a/gcc/config/arm/arm.h > +++ b/gcc/config/arm/arm.h > @@ -97,6 +97,8 @@ extern char arm_arch_name[]; > builtin_define ("__XSCALE__"); \ > if (arm_arch_iwmmxt) \ > builtin_define ("__IWMMXT__"); \ > + if (arm_arch_iwmmxt2) \ > + builtin_define ("__IWMMXT2__"); \ > if (TARGET_AAPCS_BASED) \ > { \ > if (arm_pcs_default == ARM_PCS_AAPCS_VFP) \ > @@ -194,7 +196,9 @@ extern void > (*arm_lang_output_object_attributes_hook)(void); > #define TARGET_MAVERICK (arm_fpu_desc->model == > ARM_FP_MODEL_MAVERICK) > #define TARGET_VFP (arm_fpu_desc->model == ARM_FP_MODEL_VFP) > #define TARGET_IWMMXT (arm_arch_iwmmxt) > +#define TARGET_IWMMXT2 (arm_arch_iwmmxt2) > #define TARGET_REALLY_IWMMXT (TARGET_IWMMXT && TARGET_32BIT) > +#define TARGET_REALLY_IWMMXT2 (TARGET_IWMMXT2 && TARGET_32BIT) > #define TARGET_IWMMXT_ABI (TARGET_32BIT && arm_abi == ARM_ABI_IWMMXT) > #define TARGET_ARM (! TARGET_THUMB) > #define TARGET_EITHER 1 /* (TARGET_ARM | TARGET_THUMB) */ > @@ -410,6 +414,9 @@ extern int arm_arch_cirrus; > /* Nonzero if this chip supports Intel XScale with Wireless MMX technology. > */ > extern int arm_arch_iwmmxt; > > +/* Nonzero if this chip supports Intel Wireless MMX2 technology. */ > +extern int arm_arch_iwmmxt2; > + > /* Nonzero if this chip is an XScale. */ > extern int arm_arch_xscale; > > diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md > index bbf6380..ad9d948 100644 > --- a/gcc/config/arm/arm.md > +++ b/gcc/config/arm/arm.md > @@ -197,7 +197,7 @@ > ; for ARM or Thumb-2 with arm_arch6, and nov6 for ARM without > ; arm_arch6. This attribute is used to compute attribute "enabled", > ; use type "any" to enable an alternative in all cases. > -(define_attr "arch" > "any,a,t,32,t1,t2,v6,nov6,onlya8,neon_onlya8,nota8,neon_nota8" > +(define_attr "arch" > "any,a,t,32,t1,t2,v6,nov6,onlya8,neon_onlya8,nota8,neon_nota8,iwmmxt,iwmmxt2" > (const_string "any")) > > (define_attr "arch_enabled" "no,yes" > @@ -248,6 +248,10 @@ > (and (eq_attr "arch" "neon_nota8") > (not (eq_attr "tune" "cortexa8")) > (match_test "TARGET_NEON")) > + (const_string "yes") > +
Unnecessary new line here. > + (and (eq_attr "arch" "iwmmxt2") > + (match_test "TARGET_REALLY_IWMMXT2")) > (const_string "yes")] > (const_string "no"))) Given that we already have iwmmxt2 as a CPU it isn't really changing behaviour. OK with that change. regards, Ramana > > -- > 1.7.3.4 >