Add detection of VFP v3 variants to mono-hwcap-arm.
authorAlex Rønne Petersen <alexrp@xamarin.com>
Fri, 2 Aug 2013 05:15:13 +0000 (07:15 +0200)
committerAlex Rønne Petersen <alexrp@xamarin.com>
Mon, 2 Dec 2013 18:27:37 +0000 (19:27 +0100)
mono/utils/mono-hwcap-arm.c
mono/utils/mono-hwcap-arm.h

index 2be0b023c90f8efc4d520d39431175eeb2f3025b..01816d8c93a702e0e73fcbd333fc7a440fcf9181 100644 (file)
@@ -35,6 +35,8 @@ gboolean mono_hwcap_arm_is_v6 = FALSE;
 gboolean mono_hwcap_arm_is_v7 = FALSE;
 gboolean mono_hwcap_arm_is_v7s = FALSE;
 gboolean mono_hwcap_arm_has_vfp = FALSE;
+gboolean mono_hwcap_arm_has_vfp3 = FALSE;
+gboolean mono_hwcap_arm_has_vfp3_d16 = FALSE;
 gboolean mono_hwcap_arm_has_thumb = FALSE;
 gboolean mono_hwcap_arm_has_thumb2 = FALSE;
 
@@ -60,6 +62,14 @@ mono_hwcap_arch_init (void)
                if (hwcap & 0x00000040)
                        mono_hwcap_arm_has_vfp = TRUE;
 
+               /* HWCAP_ARM_VFPv3 */
+               if (hwcap & 0x00002000)
+                       mono_hwcap_arm_has_vfp3 = TRUE;
+
+               /* HWCAP_ARM_VFPv3D16 */
+               if (hwcap & 0x00004000)
+                       mono_hwcap_arm_has_vfp3_d16 = TRUE;
+
                /* TODO: Find a way to detect Thumb 2. */
        }
 
@@ -136,6 +146,12 @@ mono_hwcap_arch_init (void)
                                if (strstr (line, "vfp"))
                                        mono_hwcap_arm_has_vfp = TRUE;
 
+                               if (strstr (line, "vfpv3"))
+                                       mono_hwcap_arm_has_vfp3 = TRUE;
+
+                               if (strstr (line, "vfpv3-d16"))
+                                       mono_hwcap_arm_has_vfp3_d16 = TRUE;
+
                                continue;
                        }
                }
@@ -154,6 +170,8 @@ mono_hwcap_print(FILE *f)
        g_fprintf (f, "mono_hwcap_arm_is_v7 = %i\n", mono_hwcap_arm_is_v7);
        g_fprintf (f, "mono_hwcap_arm_is_v7s = %i\n", mono_hwcap_arm_is_v7s);
        g_fprintf (f, "mono_hwcap_arm_has_vfp = %i\n", mono_hwcap_arm_has_vfp);
+       g_fprintf (f, "mono_hwcap_arm_has_vfp3 = %i\n", mono_hwcap_arm_has_vfp3);
+       g_fprintf (f, "mono_hwcap_arm_has_vfp3_d16 = %i\n", mono_hwcap_arm_has_vfp3_d16);
        g_fprintf (f, "mono_hwcap_arm_has_thumb = %i\n", mono_hwcap_arm_has_thumb);
        g_fprintf (f, "mono_hwcap_arm_has_thumb2 = %i\n", mono_hwcap_arm_has_thumb2);
 }
index 6bc9c3b907ad6fd8332a3e04b3411ac6ba9ff7c0..76a20a1f53dd25c7db77a447c3fd91918251be4a 100644 (file)
@@ -8,6 +8,8 @@ extern gboolean mono_hwcap_arm_is_v6;
 extern gboolean mono_hwcap_arm_is_v7;
 extern gboolean mono_hwcap_arm_is_v7s;
 extern gboolean mono_hwcap_arm_has_vfp;
+extern gboolean mono_hwcap_arm_has_vfp3;
+extern gboolean mono_hwcap_arm_has_vfp3_d16;
 extern gboolean mono_hwcap_arm_has_thumb;
 extern gboolean mono_hwcap_arm_has_thumb2;