[llvm-commits] [llvm-gcc-4.2] r99071 - in /llvm-gcc-4.2/trunk/gcc/config/arm: arm.c arm.h bpabi.h darwin.h fpa.md linux-elf.h netbsd-elf.h

Anton Korobeynikov asl at math.spbu.ru
Sat Mar 20 12:21:21 PDT 2010


Author: asl
Date: Sat Mar 20 14:21:21 2010
New Revision: 99071

URL: http://llvm.org/viewvc/llvm-project?rev=99071&view=rev
Log:
Refactor ARM FPU features handling - merge different arrays into one big one. This simplifies alot all the mess we have with different features which can be enabled / disabled independently.

Modified:
    llvm-gcc-4.2/trunk/gcc/config/arm/arm.c
    llvm-gcc-4.2/trunk/gcc/config/arm/arm.h
    llvm-gcc-4.2/trunk/gcc/config/arm/bpabi.h
    llvm-gcc-4.2/trunk/gcc/config/arm/darwin.h
    llvm-gcc-4.2/trunk/gcc/config/arm/fpa.md
    llvm-gcc-4.2/trunk/gcc/config/arm/linux-elf.h
    llvm-gcc-4.2/trunk/gcc/config/arm/netbsd-elf.h

Modified: llvm-gcc-4.2/trunk/gcc/config/arm/arm.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/arm/arm.c?rev=99071&r1=99070&r2=99071&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/arm/arm.c (original)
+++ llvm-gcc-4.2/trunk/gcc/config/arm/arm.c Sat Mar 20 14:21:21 2010
@@ -544,14 +544,11 @@
 static enum processor_type arm_default_cpu = arm_none;
 
 /* APPLE LOCAL end v7 support. Merge from mainline */
-/* Which floating point model to use.  */
-enum arm_fp_model arm_fp_model;
-
-/* Which floating point hardware is available.  */
-enum fputype arm_fpu_arch;
+/* LLVM LOCAL begin */
+int arm_fpu_attr;
 
-/* Which floating point hardware to schedule for.  */
-enum fputype arm_fpu_tune;
+const struct fpu_desc * arm_fpu_desc;
+/* LLVM LOCAL end */
 
 /* Whether to use floating point hardware.  */
 enum float_abi_type arm_float_abi;
@@ -881,49 +878,26 @@
 char arm_arch_name[ARM_ARCH_NAME_SIZE] = "__ARM_ARCH_0UNK__";
 /* APPLE LOCAL end v7 support. Merge from Codesourcery */
 
-struct fpu_desc
-{
-  const char * name;
-  enum fputype fpu;
-};
-
+/* LLVM LOCAL delete fpu_desc type fwd decl */
 
 /* Available values for -mfpu=.  */
 
+/* LLVM LOCAL begin */
 static const struct fpu_desc all_fpus[] =
 {
-  {"fpa",	FPUTYPE_FPA},
-  {"fpe2",	FPUTYPE_FPA_EMU2},
-  {"fpe3",	FPUTYPE_FPA_EMU2},
-  {"maverick",	FPUTYPE_MAVERICK},
-/* APPLE LOCAL begin v7 support. Merge from mainline */
-  {"vfp",	FPUTYPE_VFP},
-  {"vfp3",	FPUTYPE_VFP3},
-/* APPLE LOCAL end v7 support. Merge from mainline */
-/* APPLE LOCAL v7 support. Merge from Codesourcery */
-  {"neon",	FPUTYPE_NEON}
-};
-
-
-/* Floating point models used by the different hardware.
-   See fputype in arm.h.  */
-
-static const enum fputype fp_model_for_fpu[] =
-{
-  /* No FP hardware.  */
-  ARM_FP_MODEL_UNKNOWN,		/* FPUTYPE_NONE  */
-  ARM_FP_MODEL_FPA,		/* FPUTYPE_FPA  */
-  ARM_FP_MODEL_FPA,		/* FPUTYPE_FPA_EMU2  */
-  ARM_FP_MODEL_FPA,		/* FPUTYPE_FPA_EMU3  */
-  ARM_FP_MODEL_MAVERICK,	/* FPUTYPE_MAVERICK  */
-/* APPLE LOCAL v7 support. Merge from mainline */
-  ARM_FP_MODEL_VFP,		/* FPUTYPE_VFP  */
-/* APPLE LOCAL begin v7 support. Merge from Codesourcery */
-  ARM_FP_MODEL_VFP,		/* FPUTYPE_VFP3  */
-  ARM_FP_MODEL_VFP		/* FPUTYPE_NEON  */
-/* APPLE LOCAL end v7 support. Merge from Codesourcery */
+  {"fpa",	FPUTYPE_FPA,      ARM_FP_MODEL_FPA,      false},
+  {"fpe2",	FPUTYPE_FPA_EMU2, ARM_FP_MODEL_FPA,      false},
+  {"fpe3",	FPUTYPE_FPA_EMU3, ARM_FP_MODEL_FPA,      false},
+  {"maverick",	FPUTYPE_MAVERICK, ARM_FP_MODEL_MAVERICK, false},
+  {"vfp",	FPUTYPE_VFP,      ARM_FP_MODEL_VFP,      false},
+  {"vfp3",	FPUTYPE_VFP3,     ARM_FP_MODEL_VFP,      false},
+  {"vfp3-fp16",	FPUTYPE_VFP3,     ARM_FP_MODEL_VFP,      true},
+  {"neon",	FPUTYPE_NEON,     ARM_FP_MODEL_VFP,      false},
+  {"neon-fp16",	FPUTYPE_NEON,     ARM_FP_MODEL_VFP,      true}
 };
+/* LLVM LOCAL end */
 
+/* LLVM LOCAL remove fp_mode_for_fpu */
 
 struct float_abi
 {
@@ -1224,6 +1198,7 @@
   set_optab_libfunc (smod_optab, SImode, NULL);
   set_optab_libfunc (umod_optab, SImode, NULL);
 
+  /* LLVM LOCAL begin HF */
   set_conv_libfunc (trunc_optab, HFmode, SFmode, "__gnu_f2h_ieee");
   set_conv_libfunc (sext_optab,  SFmode, HFmode, "__gnu_h2f_ieee");
 
@@ -1240,6 +1215,7 @@
   set_optab_libfunc (ge_optab,   HFmode, NULL);
   set_optab_libfunc (gt_optab,   HFmode, NULL);
   set_optab_libfunc (unord_optab,HFmode, NULL);
+  /* LLVM LOCAL end HF */
 }
 
 /* Implement TARGET_HANDLE_OPTION.  */
@@ -1637,7 +1613,6 @@
   if (TARGET_IWMMXT_ABI && !TARGET_IWMMXT)
     error ("iwmmxt abi requires an iwmmxt capable cpu");
 
-  arm_fp_model = ARM_FP_MODEL_UNKNOWN;
   if (target_fpu_name == NULL && target_fpe_name != NULL)
     {
       if (streq (target_fpe_name, "2"))
@@ -1648,48 +1623,34 @@
 	error ("invalid floating point emulation option: -mfpe=%s",
 	       target_fpe_name);
     }
-  if (target_fpu_name != NULL)
-    {
-      /* The user specified a FPU.  */
-      for (i = 0; i < ARRAY_SIZE (all_fpus); i++)
-	{
-	  if (streq (all_fpus[i].name, target_fpu_name))
-	    {
-	      arm_fpu_arch = all_fpus[i].fpu;
-	      arm_fpu_tune = arm_fpu_arch;
-	      arm_fp_model = fp_model_for_fpu[arm_fpu_arch];
-	      break;
-	    }
-	}
-      if (arm_fp_model == ARM_FP_MODEL_UNKNOWN)
-	error ("invalid floating point option: -mfpu=%s", target_fpu_name);
-    }
-  else
+  /* LLVM LOCAL begin */
+  if (target_fpu_name == NULL)
     {
 #ifdef FPUTYPE_DEFAULT
-      /* Use the default if it is specified for this platform.  */
-      arm_fpu_arch = FPUTYPE_DEFAULT;
-      arm_fpu_tune = FPUTYPE_DEFAULT;
+      target_fpu_name = FPUTYPE_DEFAULT;
 #else
-      /* Pick one based on CPU type.  */
-      /* ??? Some targets assume FPA is the default.
-      if ((insn_flags & FL_VFP) != 0)
-	arm_fpu_arch = FPUTYPE_VFP;
-      else
-      */
       if (arm_arch_cirrus)
-	arm_fpu_arch = FPUTYPE_MAVERICK;
+	target_fpu_name = "maverick";
       else
-	arm_fpu_arch = FPUTYPE_FPA_EMU2;
+	target_fpu_name = "fpe2";
 #endif
-      if (tune_flags & FL_CO_PROC && arm_fpu_arch == FPUTYPE_FPA_EMU2)
-	arm_fpu_tune = FPUTYPE_FPA;
-      else
-	arm_fpu_tune = arm_fpu_arch;
-      arm_fp_model = fp_model_for_fpu[arm_fpu_arch];
-      gcc_assert (arm_fp_model != ARM_FP_MODEL_UNKNOWN);
     }
 
+  arm_fpu_desc = NULL;
+  for (i = 0; i < ARRAY_SIZE (all_fpus); i++)
+    {
+      if (streq (all_fpus[i].name, target_fpu_name))
+	{
+	  arm_fpu_desc = &all_fpus[i];
+	  arm_fpu_attr= arm_fpu_desc->fpu;
+	  break;
+	}
+    }
+
+  if (arm_fpu_desc == NULL)
+    error ("invalid floating point option: -mfpu=%s", target_fpu_name);
+  /* LLVM LOCAL end */
+
   if (target_float_abi_name != NULL)
     {
       /* The user specified a FP ABI.  */
@@ -1729,15 +1690,16 @@
   /* APPLE LOCAL end v7 support. Merge from mainline */
   /* If soft-float is specified then don't use FPU.  */
   if (TARGET_SOFT_FLOAT)
-    arm_fpu_arch = FPUTYPE_NONE;
+    /* LLVM LOCAL */
+    arm_fpu_attr = FPUTYPE_NONE;
 
   /* For arm2/3 there is no need to do any scheduling if there is only
      a floating point emulator, or we are doing software floating-point.  */
   /* LLVM LOCAL begin */
 #ifndef ENABLE_LLVM
   if ((TARGET_SOFT_FLOAT
-       || arm_fpu_tune == FPUTYPE_FPA_EMU2
-       || arm_fpu_tune == FPUTYPE_FPA_EMU3)
+       || arm_fpu_attr == FPUTYPE_FPA_EMU2
+       || arm_fpu_attr == FPUTYPE_FPA_EMU3)
       && (tune_flags & FL_MODE32) == 0)
     flag_schedule_insns = flag_schedule_insns_after_reload = 0;
 #endif
@@ -12977,7 +12939,8 @@
         inclusive_bitmask (ARM_HARD_FRAME_POINTER_REGNUM + 1, 11);
       /* APPLE LOCAL end ARM custom frame layout */
 
-      if (arm_fpu_arch == FPUTYPE_FPA_EMU2)
+      /* LLVM LOCAL */
+      if (arm_fpu_attr == FPUTYPE_FPA_EMU2)
 	{
 	  for (reg = LAST_FPA_REGNUM; reg >= FIRST_FPA_REGNUM; reg--)
 	    if (regs_ever_live[reg] && !call_used_regs[reg])
@@ -13244,7 +13207,8 @@
 	      && !TARGET_IWMMXT
 	      && really_return
 	      && TARGET_SOFT_FLOAT
-	      && arm_fpu_arch == FPUTYPE_NONE
+	      /* LLVM LOCAL */
+	      && arm_fpu_attr == FPUTYPE_NONE
 	      && !flag_pic
 	      && !frame_pointer_needed)
 	    {
@@ -13266,7 +13230,8 @@
       /* APPLE LOCAL end ARM combine stack pop and register pop */
       /* APPLE LOCAL end ARM indirect sibcalls */
 
-      if (arm_fpu_arch == FPUTYPE_FPA_EMU2)
+      /* LLVM LOCAL */
+      if (arm_fpu_attr == FPUTYPE_FPA_EMU2)
 	{
 	  for (reg = FIRST_FPA_REGNUM; reg <= LAST_FPA_REGNUM; reg++)
 	    if (regs_ever_live[reg] && !call_used_regs[reg])
@@ -13945,7 +13910,8 @@
 
   /* Save any floating point call-saved registers used by this
      function.  */
-  if (arm_fpu_arch == FPUTYPE_FPA_EMU2)
+  /* LLVM LOCAL */
+  if (arm_fpu_attr == FPUTYPE_FPA_EMU2)
     {
       for (reg = LAST_FPA_REGNUM; reg >= FIRST_FPA_REGNUM; reg--)
 	if (regs_ever_live[reg] && !call_used_regs[reg])
@@ -14182,7 +14148,8 @@
       if (optimize_size
 	  && !flag_pic
 	  && !frame_pointer_needed
-	  && arm_fpu_arch == FPUTYPE_NONE
+	  /* LLVM LOCAL */
+	  && arm_fpu_attr == FPUTYPE_NONE
 	  && TARGET_SOFT_FLOAT
 	  && !TARGET_IWMMXT)
 	{
@@ -22065,7 +22032,7 @@
       else
 	{
 	  int set_float_abi_attributes = 0;
-	  switch (arm_fpu_arch)
+	  switch (arm_fpu_desc->fpu)
 	    {
 	    case FPUTYPE_FPA:
 	      fpu_name = "fpa";

Modified: llvm-gcc-4.2/trunk/gcc/config/arm/arm.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/arm/arm.h?rev=99071&r1=99070&r2=99071&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/arm/arm.h (original)
+++ llvm-gcc-4.2/trunk/gcc/config/arm/arm.h Sat Mar 20 14:21:21 2010
@@ -216,9 +216,11 @@
 #define TARGET_HARD_FLOAT		(arm_float_abi != ARM_FLOAT_ABI_SOFT)
 /* Use hardware floating point calling convention.  */
 #define TARGET_HARD_FLOAT_ABI		(arm_float_abi == ARM_FLOAT_ABI_HARD)
-#define TARGET_FPA			(arm_fp_model == ARM_FP_MODEL_FPA)
-#define TARGET_MAVERICK			(arm_fp_model == ARM_FP_MODEL_MAVERICK)
-#define TARGET_VFP			(arm_fp_model == ARM_FP_MODEL_VFP)
+/* LLVM LOCAL begin */
+#define TARGET_FPA			(arm_fpu_desc->model == ARM_FP_MODEL_FPA)
+#define TARGET_MAVERICK			(arm_fpu_desc->model == ARM_FP_MODEL_MAVERICK)
+#define TARGET_VFP			(arm_fpu_desc->model == ARM_FP_MODEL_VFP)
+/* LLVM LOCAL end */
 /* APPLE LOCAL begin v7 support. Merge from mainline */
 #define TARGET_IWMMXT			(arm_arch_iwmmxt)
 #define TARGET_REALLY_IWMMXT		(TARGET_IWMMXT && TARGET_32BIT)
@@ -260,22 +262,24 @@
 
 /* LLVM LOCAL begin */
 /* FPU is has the full VFPv3/NEON register file of 32 D registers.  */
-#define TARGET_VFP3_REGSET (arm_fp_model == ARM_FP_MODEL_VFP \
-			    && (arm_fpu_arch == FPUTYPE_VFP3 \
-				|| arm_fpu_arch == FPUTYPE_NEON))
+#define TARGET_VFP3_REGSET (arm_fpu_desc->model == ARM_FP_MODEL_VFP \
+			    && (arm_fpu_desc->fpu == FPUTYPE_VFP3 \
+				|| arm_fpu_desc->fpu == FPUTYPE_NEON))
 
 /* FPU supports VFPv3 instructions.  */
-#define TARGET_VFP3 (arm_fp_model == ARM_FP_MODEL_VFP \
-		     && (arm_fpu_arch == FPUTYPE_VFP3))
+#define TARGET_VFP3 (arm_fpu_desc->model == ARM_FP_MODEL_VFP \
+		     && (arm_fpu_desc->fpu == FPUTYPE_VFP3))
 /* LLVM LOCAL end */
 
 /* FPU supports Neon instructions.  The setting of this macro gets
    revealed via __ARM_NEON__ so we add extra guards upon TARGET_32BIT
    and TARGET_HARD_FLOAT to ensure that NEON instructions are
    available.  */
+/* LLVM LOCAL begin */
 #define TARGET_NEON (TARGET_32BIT && TARGET_HARD_FLOAT \
-                     && arm_fp_model == ARM_FP_MODEL_VFP \
-		     && arm_fpu_arch == FPUTYPE_NEON)
+                     && arm_fpu_desc->model == ARM_FP_MODEL_VFP \
+		     && arm_fpu_desc->fpu == FPUTYPE_NEON)
+/* LLVM LOCAL end */
 /* APPLE LOCAL end v7 support. Merge from Codesourcery */
 /* APPLE LOCAL begin v7 support. Merge from mainline */
 
@@ -337,7 +341,7 @@
   ARM_FP_MODEL_VFP
 };
 
-extern enum arm_fp_model arm_fp_model;
+/* LLVM LOCAL remove arm_fp_model decl */
 
 /* Which floating point hardware is available.  Also update
    fp_model_for_fpu in arm.c when adding entries to this list.  */
@@ -363,14 +367,21 @@
 /* APPLE LOCAL end v7 support. Merge from Codesourcery */
 };
 
-/* Recast the floating point class to be the floating point attribute.  */
-#define arm_fpu_attr ((enum attr_fpu) arm_fpu_tune)
+extern int arm_fpu_attr;
 
-/* What type of floating point to tune for */
-extern enum fputype arm_fpu_tune;
+/* LLVM LOCAL begin */
+struct fpu_desc
+{
+  const char * name;
+  enum fputype fpu;
+  /* LLVM LOCAL begin */
+  enum arm_fp_model model;
+  int fp16;
+  /* LLVM LOCAL end */
+};
 
-/* What type of floating point instructions are available */
-extern enum fputype arm_fpu_arch;
+extern const struct fpu_desc * arm_fpu_desc;
+/* LLVM LOCAL end */
 
 enum float_abi_type
 {

Modified: llvm-gcc-4.2/trunk/gcc/config/arm/bpabi.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/arm/bpabi.h?rev=99071&r1=99070&r2=99071&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/arm/bpabi.h (original)
+++ llvm-gcc-4.2/trunk/gcc/config/arm/bpabi.h Sat Mar 20 14:21:21 2010
@@ -31,7 +31,7 @@
 
 /* Section 4.1 of the AAPCS requires the use of VFP format.  */
 #undef FPUTYPE_DEFAULT
-#define FPUTYPE_DEFAULT FPUTYPE_VFP
+#define FPUTYPE_DEFAULT "vfp"
 
 /* EABI targets should enable interworking by default.  */
 #undef TARGET_DEFAULT

Modified: llvm-gcc-4.2/trunk/gcc/config/arm/darwin.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/arm/darwin.h?rev=99071&r1=99070&r2=99071&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/arm/darwin.h (original)
+++ llvm-gcc-4.2/trunk/gcc/config/arm/darwin.h Sat Mar 20 14:21:21 2010
@@ -329,7 +329,7 @@
 
 /* APPLE LOCAL begin 6093388 -mfpu=neon default for v7a */
 /* We default to VFP for v6, NEON for v7 */
-#define FPUTYPE_DEFAULT (arm_arch7a ? FPUTYPE_NEON : FPUTYPE_VFP)
+#define FPUTYPE_DEFAULT (arm_arch7a ? "neon" : "vfp")
 
 #undef TARGET_DEFAULT_FLOAT_ABI
 #define TARGET_DEFAULT_FLOAT_ABI ((arm_arch6 || arm_arch7a) ? ARM_FLOAT_ABI_SOFTFP : ARM_FLOAT_ABI_SOFT)

Modified: llvm-gcc-4.2/trunk/gcc/config/arm/fpa.md
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/arm/fpa.md?rev=99071&r1=99070&r2=99071&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/arm/fpa.md (original)
+++ llvm-gcc-4.2/trunk/gcc/config/arm/fpa.md Sat Mar 20 14:21:21 2010
@@ -644,10 +644,10 @@
     {
     default:
     case 0: return \"mvf%?e\\t%0, %1\";
-    case 1: if (arm_fpu_arch == FPUTYPE_FPA_EMU2)
+    case 1: if (arm_fpu_desc->model == FPUTYPE_FPA_EMU2)
 	      return \"ldf%?e\\t%0, %1\";
 	    return \"lfm%?\\t%0, 1, %1\";
-    case 2: if (arm_fpu_arch == FPUTYPE_FPA_EMU2)
+    case 2: if (arm_fpu_desc->model == FPUTYPE_FPA_EMU2)
 	      return \"stf%?e\\t%1, %0\";
 	    return \"sfm%?\\t%1, 1, %0\";
     }

Modified: llvm-gcc-4.2/trunk/gcc/config/arm/linux-elf.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/arm/linux-elf.h?rev=99071&r1=99070&r2=99071&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/arm/linux-elf.h (original)
+++ llvm-gcc-4.2/trunk/gcc/config/arm/linux-elf.h Sat Mar 20 14:21:21 2010
@@ -87,7 +87,7 @@
 
 /* NWFPE always understands FPA instructions.  */
 #undef  FPUTYPE_DEFAULT
-#define FPUTYPE_DEFAULT FPUTYPE_FPA_EMU3
+#define FPUTYPE_DEFAULT "fpe3"
 
 /* Call the function profiler with a given profile label.  */
 #undef  ARM_FUNCTION_PROFILER

Modified: llvm-gcc-4.2/trunk/gcc/config/arm/netbsd-elf.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/arm/netbsd-elf.h?rev=99071&r1=99070&r2=99071&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/arm/netbsd-elf.h (original)
+++ llvm-gcc-4.2/trunk/gcc/config/arm/netbsd-elf.h Sat Mar 20 14:21:21 2010
@@ -154,5 +154,5 @@
 while (0)
 
 #undef FPUTYPE_DEFAULT
-#define FPUTYPE_DEFAULT FPUTYPE_VFP
+#define FPUTYPE_DEFAULT "vfp"
 





More information about the llvm-commits mailing list