The iwmmxt ABI is a variant of the ABI that supported passing certain
parameters and results in iwmmxt registers.  But since we no-longer
support the instructions that can read and write these registers, the
ABI variant can no-longer be used.

gcc/ChangeLog:

        * config.gcc (arm, --with-abi): Remove iwmmxt abi option.
        * config/arm/arm.opt (enum ARM_ABI_IWMMXT): Remove.
        * config/arm/arm.h (TARGET_IWMMXT_ABI): Delete.
        (enum arm_pcs): Remove ARM_PCS_AAPCS_IWMMXT.
        (FUNCTION_ARG_REGNO_P): Remove IWMMXT ABI support.
        (CUMULATIVE_ARGS): Remove iwmmxt_nregs.
        * config/arm/arm.cc (arm_options_perform_arch_sanity_checks):
        Remove IWMMXT ABI checks.
        (arm_libcall_value_1): Likewise.
        (arm_function_value_regno_p): Likewise.
        (arm_apply_result_size): Remove adjustment for IWMMXT ABI.
        (arm_function_arg): Remove IWMMXT ABI support.
        (arm_arg_partial_bytes): Likewise.
        (arm_function_arg_advance): Likewise.
        (arm_init_cumulative_args): Don't initialize iwmmxt_nregs.
        * doc/invoke.texi (arm -mabi): Remove mention of the iwmmxt
        ABI option.
        * config/arm/arm-opts.h (enum arm_abi_type): Remove ARM_ABI_IWMMXT.
---
 gcc/config.gcc            |  2 +-
 gcc/config/arm/arm-opts.h |  1 -
 gcc/config/arm/arm.cc     | 44 +++------------------------------------
 gcc/config/arm/arm.h      |  8 +------
 gcc/config/arm/arm.opt    |  3 ---
 gcc/doc/invoke.texi       |  2 +-
 6 files changed, 6 insertions(+), 54 deletions(-)

diff --git a/gcc/config.gcc b/gcc/config.gcc
index afbf82fd2b8..c9fe996f2f7 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -4459,7 +4459,7 @@ case "${target}" in
 
                case "$with_abi" in
                "" \
-               | apcs-gnu | atpcs | aapcs | iwmmxt | aapcs-linux )
+               | apcs-gnu | atpcs | aapcs | aapcs-linux )
                        #OK
                        ;;
                *)
diff --git a/gcc/config/arm/arm-opts.h b/gcc/config/arm/arm-opts.h
index 06a1939d087..5c543bf5246 100644
--- a/gcc/config/arm/arm-opts.h
+++ b/gcc/config/arm/arm-opts.h
@@ -46,7 +46,6 @@ enum arm_abi_type
   ARM_ABI_APCS,
   ARM_ABI_ATPCS,
   ARM_ABI_AAPCS,
-  ARM_ABI_IWMMXT,
   ARM_ABI_AAPCS_LINUX
 };
 
diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc
index 670f487bcce..30beae03ffe 100644
--- a/gcc/config/arm/arm.cc
+++ b/gcc/config/arm/arm.cc
@@ -4000,9 +4000,6 @@ arm_options_perform_arch_sanity_checks (void)
   if (TARGET_IWMMXT && !ARM_DOUBLEWORD_ALIGN)
     error ("iwmmxt requires an AAPCS compatible ABI for proper operation");
 
-  if (TARGET_IWMMXT_ABI && !TARGET_IWMMXT)
-    error ("iwmmxt abi requires an iwmmxt capable cpu");
-
   /* BPABI targets use linker tricks to allow interworking on cores
      without thumb support.  */
   if (TARGET_INTERWORK
@@ -4043,9 +4040,7 @@ arm_options_perform_arch_sanity_checks (void)
 
   if (TARGET_AAPCS_BASED)
     {
-      if (arm_abi == ARM_ABI_IWMMXT)
-       arm_pcs_default = ARM_PCS_AAPCS_IWMMXT;
-      else if (TARGET_HARD_FLOAT_ABI)
+      if (TARGET_HARD_FLOAT_ABI)
        {
          arm_pcs_default = ARM_PCS_AAPCS_VFP;
          if (!bitmap_bit_p (arm_active_target.isa, isa_bit_vfpv2)
@@ -6048,9 +6043,6 @@ arm_libcall_value_1 (machine_mode mode)
 {
   if (TARGET_AAPCS_BASED)
     return aapcs_libcall_value (mode);
-  else if (TARGET_IWMMXT_ABI
-          && arm_vector_mode_supported_p (mode))
-    return gen_rtx_REG (mode, FIRST_IWMMXT_REGNUM);
   else
     return gen_rtx_REG (mode, ARG_REGISTER (1));
 }
@@ -6083,9 +6075,7 @@ arm_function_value_regno_p (const unsigned int regno)
       || (TARGET_32BIT
          && TARGET_AAPCS_BASED
          && TARGET_HARD_FLOAT
-         && regno == FIRST_VFP_REGNUM)
-      || (TARGET_IWMMXT_ABI
-         && regno == FIRST_IWMMXT_REGNUM))
+         && regno == FIRST_VFP_REGNUM))
     return true;
 
   return false;
@@ -6102,8 +6092,6 @@ arm_apply_result_size (void)
     {
       if (TARGET_HARD_FLOAT_ABI)
        size += 32;
-      if (TARGET_IWMMXT_ABI)
-       size += 8;
     }
 
   return size;
@@ -6265,7 +6253,6 @@ const struct pcs_attribute_arg
 #if 0
     /* We could recognize these, but changes would be needed elsewhere
      * to implement them.  */
-    {"aapcs-iwmmxt", ARM_PCS_AAPCS_IWMMXT},
     {"atpcs", ARM_PCS_ATPCS},
     {"apcs", ARM_PCS_APCS},
 #endif
@@ -7195,7 +7182,6 @@ arm_init_cumulative_args (CUMULATIVE_ARGS *pcum, tree 
fntype,
 
   /* On the ARM, the offset starts at 0.  */
   pcum->nregs = 0;
-  pcum->iwmmxt_nregs = 0;
   pcum->can_split = true;
 
   /* Varargs vectors are treated the same as long long.
@@ -7308,22 +7294,6 @@ arm_function_arg (cumulative_args_t pcum_v, const 
function_arg_info &arg)
       return pcum->aapcs_reg;
     }
 
-  /* Varargs vectors are treated the same as long long.
-     named_count avoids having to change the way arm handles 'named' */
-  if (TARGET_IWMMXT_ABI
-      && arm_vector_mode_supported_p (arg.mode)
-      && pcum->named_count > pcum->nargs + 1)
-    {
-      if (pcum->iwmmxt_nregs <= 9)
-       return gen_rtx_REG (arg.mode,
-                           pcum->iwmmxt_nregs + FIRST_IWMMXT_REGNUM);
-      else
-       {
-         pcum->can_split = false;
-         return NULL_RTX;
-       }
-    }
-
   /* Put doubleword aligned quantities in even register pairs.  */
   if ((pcum->nregs & 1) && ARM_DOUBLEWORD_ALIGN)
     {
@@ -7383,9 +7353,6 @@ arm_arg_partial_bytes (cumulative_args_t pcum_v, const 
function_arg_info &arg)
       return pcum->aapcs_partial;
     }
 
-  if (TARGET_IWMMXT_ABI && arm_vector_mode_supported_p (arg.mode))
-    return 0;
-
   if (NUM_ARG_REGS > nregs
       && (NUM_ARG_REGS < nregs + ARM_NUM_REGS2 (arg.mode, arg.type))
       && pcum->can_split)
@@ -7422,12 +7389,7 @@ arm_function_arg_advance (cumulative_args_t pcum_v,
   else
     {
       pcum->nargs += 1;
-      if (arm_vector_mode_supported_p (arg.mode)
-         && pcum->named_count > pcum->nargs
-         && TARGET_IWMMXT_ABI)
-       pcum->iwmmxt_nregs += 1;
-      else
-       pcum->nregs += ARM_NUM_REGS2 (arg.mode, arg.type);
+      pcum->nregs += ARM_NUM_REGS2 (arg.mode, arg.type);
     }
 }
 
diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
index 9c3a644873b..3f6fb0378ea 100644
--- a/gcc/config/arm/arm.h
+++ b/gcc/config/arm/arm.h
@@ -143,7 +143,6 @@ emission of floating point pcs attributes.  */
                                         && !TARGET_GENERAL_REGS_ONLY)
 #define TARGET_REALLY_IWMMXT2          (TARGET_IWMMXT2 && TARGET_32BIT \
                                         && !TARGET_GENERAL_REGS_ONLY)
-#define TARGET_IWMMXT_ABI (TARGET_32BIT && arm_abi == ARM_ABI_IWMMXT)
 #define TARGET_ARM                      (! TARGET_THUMB)
 #define TARGET_EITHER                  1 /* (TARGET_ARM | TARGET_THUMB) */
 #define TARGET_BACKTRACE               (crtl->is_leaf \
@@ -1675,7 +1674,6 @@ enum arm_pcs
 {
   ARM_PCS_AAPCS,       /* Base standard AAPCS.  */
   ARM_PCS_AAPCS_VFP,   /* Use VFP registers for floating point values.  */
-  ARM_PCS_AAPCS_IWMMXT, /* Use iWMMXT registers for vectors.  */
   /* This must be the last AAPCS variant.  */
   ARM_PCS_AAPCS_LOCAL, /* Private call within this compilation unit.  */
   ARM_PCS_ATPCS,       /* ATPCS.  */
@@ -1693,8 +1691,6 @@ typedef struct
 {
   /* This is the number of registers of arguments scanned so far.  */
   int nregs;
-  /* This is the number of iWMMXt register arguments scanned so far.  */
-  int iwmmxt_nregs;
   int named_count;
   int nargs;
   /* Which procedure call variant to use for this call.  */
@@ -1742,9 +1738,7 @@ typedef struct
 #define FUNCTION_ARG_REGNO_P(REGNO)                                    \
    (IN_RANGE ((REGNO), 0, 3)                                           \
     || (TARGET_AAPCS_BASED && TARGET_HARD_FLOAT                                
\
-       && IN_RANGE ((REGNO), FIRST_VFP_REGNUM, FIRST_VFP_REGNUM + 15)) \
-    || (TARGET_IWMMXT_ABI                                              \
-       && IN_RANGE ((REGNO), FIRST_IWMMXT_REGNUM, FIRST_IWMMXT_REGNUM + 9)))
+       && IN_RANGE ((REGNO), FIRST_VFP_REGNUM, FIRST_VFP_REGNUM + 15)))
 
 
 /* If your target environment doesn't prefix user functions with an
diff --git a/gcc/config/arm/arm.opt b/gcc/config/arm/arm.opt
index 042cb54e05b..d5eeeae7eae 100644
--- a/gcc/config/arm/arm.opt
+++ b/gcc/config/arm/arm.opt
@@ -57,9 +57,6 @@ Enum(arm_abi_type) String(atpcs) Value(ARM_ABI_ATPCS)
 EnumValue
 Enum(arm_abi_type) String(aapcs) Value(ARM_ABI_AAPCS)
 
-EnumValue
-Enum(arm_abi_type) String(iwmmxt) Value(ARM_ABI_IWMMXT)
-
 EnumValue
 Enum(arm_abi_type) String(aapcs-linux) Value(ARM_ABI_AAPCS_LINUX)
 
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index b1964b3d3f5..6a92ef4629f 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -23504,7 +23504,7 @@ These @samp{-m} options are defined for the ARM port:
 @opindex mabi
 @item -mabi=@var{name}
 Generate code for the specified ABI@.  Permissible values are: @samp{apcs-gnu},
-@samp{atpcs}, @samp{aapcs}, @samp{aapcs-linux} and @samp{iwmmxt}.
+@samp{atpcs}, @samp{aapcs} and @samp{aapcs-linux}.
 
 @opindex mapcs-frame
 @item -mapcs-frame
-- 
2.43.0

Reply via email to