break;
case AT_HWCAP:
+# if defined(VGP_arm_linux)
+ { Bool has_neon = (auxv->u.a_val & VKI_HWCAP_NEON) > 0;
+ VG_(debugLog)(2, "initimg",
+ "ARM has-neon from-auxv: %s\n",
+ has_neon ? "YES" : "NO");
+ VG_(machine_arm_set_has_NEON)( has_neon );
+ }
+# endif
break;
case AT_DCACHEBSIZE:
#endif
+/* Notify host's ability to handle NEON instructions. */
+#if defined(VGA_arm)
+void VG_(machine_arm_set_has_NEON)( Bool has_neon )
+{
+ vg_assert(hwcaps_done);
+ /* There's nothing else we can sanity check. */
+
+ if (has_neon) {
+ vai.hwcaps |= VEX_HWCAPS_ARM_NEON;
+ } else {
+ vai.hwcaps &= ~VEX_HWCAPS_ARM_NEON;
+ }
+}
+#endif
+
+
/* Fetch host cpu info, once established. */
void VG_(machine_get_VexArchInfo)( /*OUT*/VexArch* pVa,
/*OUT*/VexArchInfo* pVai )
then safe to use VG_(machine_get_VexArchInfo)
and VG_(machine_ppc64_has_VMX)
+ -------------
+ arm: initially: call VG_(machine_get_hwcaps)
+ call VG_(machine_arm_set_has_NEON)
+
+ then safe to use VG_(machine_get_VexArchInfo)
VG_(machine_get_hwcaps) may use signals (although it attempts to
leave signal state unchanged) and therefore should only be
extern void VG_(machine_ppc64_set_clszB)( Int );
#endif
+#if defined(VGA_arm)
+extern void VG_(machine_arm_set_has_NEON)( Bool );
+#endif
+
/* X86: set to 1 if the host is able to do {ld,st}mxcsr (load/store
the SSE control/status register), else zero. Is referenced from
assembly code, so do not change from a 32-bit int. */
struct vki_vm86plus_info_struct vm86plus;
};
+//----------------------------------------------------------------------
+// From linux-2.6.35.4/arch/arm/include/asm/hwcap.h
+//----------------------------------------------------------------------
+
+#define VKI_HWCAP_NEON 4096
+
//----------------------------------------------------------------------
// And that's it!
//----------------------------------------------------------------------