diff mbox series

[ARM] Add a self test for FPU feature bits

Message ID 20171005095955.GA4705@arm.com
State New
Headers show
Series [ARM] Add a self test for FPU feature bits | expand

Commit Message

Tamar Christina Oct. 5, 2017, 9:59 a.m. UTC
Hi All,

This patch adds a more elaborate self-test to the arm back-end
which tests to make sure you don't have any bit specified in
ISA_ALL_FPU_INTERNAL that are not defined by any fpu configuration.

Catching this during the self-test prevents an ICE at runtime when
-mfpu=auto tries to detect the fpu to use.

Regtested on arm-none-eabi and no issues.

Ok for trunk?

gcc/
2017-10-05  Tamar Christina  <tamar.christina@arm.com>

	* config/arm/arm.c (arm_test_fpu_data): New.
	(arm_run_selftests): Call arm_test_fpu_data.

--

Comments

Richard Earnshaw (lists) Oct. 5, 2017, 10:20 a.m. UTC | #1
On 05/10/17 10:59, Tamar Christina wrote:
> Hi All,
> 
> This patch adds a more elaborate self-test to the arm back-end
> which tests to make sure you don't have any bit specified in
> ISA_ALL_FPU_INTERNAL that are not defined by any fpu configuration.
> 
> Catching this during the self-test prevents an ICE at runtime when
> -mfpu=auto tries to detect the fpu to use.
> 
> Regtested on arm-none-eabi and no issues.
> 
> Ok for trunk?
> 
> gcc/
> 2017-10-05  Tamar Christina  <tamar.christina@arm.com>
> 
> 	* config/arm/arm.c (arm_test_fpu_data): New.
> 	(arm_run_selftests): Call arm_test_fpu_data.
> 

Can you fix the comments that refers to ALL_FPU to be ALL_FPU_INTERNAL.

OK with that change.

R.
diff mbox series

Patch

diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 4cddf3b02e5e731507c2d326b80747524fd505bf..ae7e76f8b0c38f74c8d6479ff0a209df8b97d5b4 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -31393,10 +31393,43 @@  arm_test_cpu_arch_data (void)
     }
 }
 
+/* Scan the static data tables generated by parsecpu.awk looking for
+   potential issues with the data.  Here we check for consistency between the
+   fpu bits, in particular we check that ALL_FPU does not contain a feature bit
+   that is not defined by any FPU flag.  */
+static void
+arm_test_fpu_data (void)
+{
+  auto_sbitmap isa_all_fpubits (isa_num_bits);
+  auto_sbitmap fpubits (isa_num_bits);
+  auto_sbitmap tmpset (isa_num_bits);
+
+  static const enum isa_feature fpu_bitlist[]
+    = { ISA_ALL_FPU_INTERNAL, isa_nobit };
+  arm_initialize_isa (isa_all_fpubits, fpu_bitlist);
+
+  for (unsigned int i = 0; i < TARGET_FPU_auto; i++)
+  {
+    arm_initialize_isa (fpubits, all_fpus[i].isa_bits);
+    bitmap_and_compl (tmpset, isa_all_fpubits, fpubits);
+    bitmap_clear (isa_all_fpubits);
+    bitmap_copy (isa_all_fpubits, tmpset);
+  }
+
+  if (!bitmap_empty_p (isa_all_fpubits))
+    {
+	fprintf (stderr, "Error: found feature bits in the ALL_FPU_INTERAL"
+			 " group that are not defined by any FPU.\n"
+			 "       Check your arm-cpus.in.\n");
+	ASSERT_TRUE (bitmap_empty_p (isa_all_fpubits));
+    }
+}
+
 static void
 arm_run_selftests (void)
 {
   arm_test_cpu_arch_data ();
+  arm_test_fpu_data ();
 }
 } /* Namespace selftest.  */