Add DYNAMIC_LIST support for ARM64
authorMartin Kroeker <martin@ruby.chemie.uni-freiburg.de>
Sun, 24 Jan 2021 22:18:52 +0000 (23:18 +0100)
committerGitHub <noreply@github.com>
Sun, 24 Jan 2021 22:18:52 +0000 (23:18 +0100)
driver/others/dynamic_arm64.c

index 37c0694..a86a958 100644 (file)
 #include <asm/hwcap.h>
 #include <sys/auxv.h>
 #endif
+#ifdef OS_DARWIN
+#include <sys/sysctl.h>
+int32_t value;
+size_t length=sizeof(value);
+#endif
 
 extern gotoblas_t  gotoblas_ARMV8;
+#ifdef DYNAMIC_LIST
+#ifdef DYN_CORTEXA53
+extern gotoblas_t  gotoblas_CORTEXA53;
+#else
+#define gotoblas_CORTEXA53 gotoblas_ARMV8
+#endif
+#ifdef DYN_CORTEXA57
+extern gotoblas_t  gotoblas_CORTEXA57;
+#else
+#define gotoblas_CORTEXA57 gotoblas_ARMV8
+#endif
+#ifdef DYN_CORTEXA72
+extern gotoblas_t  gotoblas_CORTEXA72;
+#else
+#define gotoblas_CORTEXA72 gotoblas_ARMV8
+#endif
+#ifdef DYN_CORTEXA73
+extern gotoblas_t  gotoblas_CORTEXA73;
+#else
+#define gotoblas_CORTEXA73 gotoblas_ARMV8
+#endif
+#ifdef DYN_FALKOR
+extern gotoblas_t  gotoblas_FALKOR;
+#else
+#define gotoblas_FALKOR gotoblas_ARMV8
+#endif
+#ifdef DYN_TSV110
+extern gotoblas_t  gotoblas_TSV110;
+#else
+#define gotoblas_TSV110 gotoblas_ARMV8
+#endif
+#ifdef DYN_THUNDERX
+extern gotoblas_t  gotoblas_THUNDERX;
+#else
+#define gotoblas_THUNDERX gotoblas_ARMV8
+#endif
+#ifdef DYN_THUNDERX2T99
+extern gotoblas_t  gotoblas_THUNDERX2T99;
+#else
+#define gotoblas_THUNDERX2T99 gotoblas_ARMV8
+#endif
+#ifdef DYN_THUNDERX3T110
+extern gotoblas_t  gotoblas_THUNDERX3T110;
+#else
+#define gotoblas_THUNDERX3T110 gotoblas_ARMV8
+#endif
+#ifdef DYN_EMAG8180
+extern gotoblas_t  gotoblas_EMAG8180;
+#else
+#define gotoblas_EMAG8180 gotoblas_ARMV8
+#endif
+#ifdef DYN_NEOVERSEN1
+extern gotoblas_t  gotoblas_NEOVERSEN1;
+#else
+#define gotoblas_NEOVERSEN1 gotoblas_ARMV8
+#endif
+#ifdef DYN_VORTEX
+extern gotoblas_t  gotoblas_VORTEX;
+#else
+#define gotoblas_VORTEX gotoblas_ARMV8
+#endif
+#else
 extern gotoblas_t  gotoblas_CORTEXA53;
 extern gotoblas_t  gotoblas_CORTEXA57;
 extern gotoblas_t  gotoblas_CORTEXA72;
@@ -54,10 +121,12 @@ extern gotoblas_t  gotoblas_TSV110;
 extern gotoblas_t  gotoblas_EMAG8180;
 extern gotoblas_t  gotoblas_NEOVERSEN1;
 extern gotoblas_t  gotoblas_THUNDERX3T110;
+extern gotoblas_t  gotoblas_VORTEX;
+#endif
 
 extern void openblas_warning(int verbose, const char * msg);
 
-#define NUM_CORETYPES   12
+#define NUM_CORETYPES   13
 
 /*
  * In case asm/hwcap.h is outdated on the build system, make sure
@@ -68,7 +137,7 @@ extern void openblas_warning(int verbose, const char * msg);
 #endif
 
 #define get_cpu_ftr(id, var) ({                                        \
-               __asm__ __volatile__("mrs %0, "#id : "=r" (var));               \
+               __asm__ ("mrs %0, "#id : "=r" (var));           \
        })
 
 static char *corename[] = {
@@ -84,6 +153,7 @@ static char *corename[] = {
   "emag8180",
   "neoversen1",
   "thunderx3t110",
+  "vortex",
   "unknown"
 };
 
@@ -100,6 +170,7 @@ char *gotoblas_corename(void) {
   if (gotoblas == &gotoblas_EMAG8180)     return corename[ 9];
   if (gotoblas == &gotoblas_NEOVERSEN1)   return corename[10];
   if (gotoblas == &gotoblas_THUNDERX3T110) return corename[11];
+  if (gotoblas == &gotoblas_VORTEX) return corename[12];
   return corename[NUM_CORETYPES];
 }
 
@@ -131,6 +202,7 @@ static gotoblas_t *force_coretype(char *coretype) {
     case  9: return (&gotoblas_EMAG8180);
     case 10: return (&gotoblas_NEOVERSEN1);
     case 11: return (&gotoblas_THUNDERX3T110);
+    case 12: return (&gotoblas_VORTEX);
   }
   snprintf(message, 128, "Core not found: %s\n", coretype);
   openblas_warning(1, message);
@@ -142,6 +214,10 @@ static gotoblas_t *get_coretype(void) {
   char coremsg[128];
 
 #if (!defined OS_LINUX && !defined OS_ANDROID)
+#ifdef DARWIN
+       sysctlbyname("hw.cpufamily",&value,&length,NULL,0);
+       if (value ==131287967) return CPU_VORTEX;
+#endif
   return NULL;
 #else