Merge branch '2.5.x'
[catacomb] / base / dispatch.c
index 459302f..db9c319 100644 (file)
@@ -54,6 +54,7 @@
 struct cpuid { unsigned a, b, c, d; };
 extern int dispatch_x86ish_cpuid(struct cpuid *, unsigned a, unsigned c);
 extern int dispatch_x86ish_xmmregisters_p(void);
+extern int dispatch_x86ish_rdrand(unsigned *);
 
 static void cpuid(struct cpuid *cc, unsigned a, unsigned c)
 {
@@ -110,25 +111,6 @@ static int xmm_registers_available_p(void)
  *             that it's already been verified to be safe to issue.
  */
 
-#ifdef __GNUC__
-static int rdrand(unsigned *x)
-{
-  int i, rc;
-  unsigned _t;
-
-  i = 16;
-  __asm__ ("" : "=g" (_t));
-  __asm__ ("0: rdrand %2; jc 1f; decl %1; jnz 0b\n"
-          "mov $-1, %0; jmp 9f\n"
-          "1: movl %2, (%3); xorl %0, %0\n"
-          "9:"
-          : "=r" (rc), "+r" (i), "+r" (_t)
-          : "r" (x)
-          : "cc");
-  return (rc);
-}
-#endif
-
 static int rdrand_works_p(void)
 {
   unsigned ref, x, i;
@@ -137,9 +119,9 @@ static int rdrand_works_p(void)
    * will fail with probability %$2^{-128}$% with a truly random generator,
    * which seems fair enough.
    */
-  if (rdrand(&ref)) goto fail;
+  if (dispatch_x86ish_rdrand(&ref)) goto fail;
   for (i = 0; i < 4; i++) {
-    if (rdrand(&x)) goto fail;
+    if (dispatch_x86ish_rdrand(&x)) goto fail;
     if (x != ref) goto not_stuck;
   }
   dispatch_debug("RDRAND always returns 0x%08x!", ref);
@@ -244,6 +226,7 @@ static unsigned hwcaps = 0;
 #  define WANTAUX(_)                                                   \
        WANT_AT_HWCAP(_)
 #  define CAPMAP(_)                                                    \
+       _(ARM_NEON, "arm:neon")                                         \
        _(ARM_AES, "arm:aes")                                           \
        _(ARM_PMULL, "arm:pmull")
 #endif
@@ -364,6 +347,7 @@ static void probe_hwcaps(void)
 #  endif
 #endif
 #if CPUFAM_ARM64
+  if (probed.hwcap & HWCAP_ASIMD) hw |= HF_ARM_NEON;
   if (probed.hwcap & HWCAP_AES) hw |= HF_ARM_AES;
   if (probed.hwcap & HWCAP_PMULL) hw |= HF_ARM_PMULL;
 #endif