Add support for Hygon Dhyanatags/v0.3.6^2
| @@ -53,6 +53,7 @@ | |||||
| #define VENDOR_SIS 8 | #define VENDOR_SIS 8 | ||||
| #define VENDOR_TRANSMETA 9 | #define VENDOR_TRANSMETA 9 | ||||
| #define VENDOR_NSC 10 | #define VENDOR_NSC 10 | ||||
| #define VENDOR_HYGON 11 | |||||
| #define VENDOR_UNKNOWN 99 | #define VENDOR_UNKNOWN 99 | ||||
| #define BITMASK(a, b, c) ((((a) >> (b)) & (c))) | #define BITMASK(a, b, c) ((((a) >> (b)) & (c))) | ||||
| @@ -116,6 +117,7 @@ | |||||
| #define CORE_EXCAVATOR 26 | #define CORE_EXCAVATOR 26 | ||||
| #define CORE_ZEN 27 | #define CORE_ZEN 27 | ||||
| #define CORE_SKYLAKEX 28 | #define CORE_SKYLAKEX 28 | ||||
| #define CORE_DHYANA 29 | |||||
| #define HAVE_SSE (1 << 0) | #define HAVE_SSE (1 << 0) | ||||
| #define HAVE_SSE2 (1 << 1) | #define HAVE_SSE2 (1 << 1) | ||||
| @@ -215,5 +217,8 @@ typedef struct { | |||||
| #define CPUTYPE_EXCAVATOR 50 | #define CPUTYPE_EXCAVATOR 50 | ||||
| #define CPUTYPE_ZEN 51 | #define CPUTYPE_ZEN 51 | ||||
| #define CPUTYPE_SKYLAKEX 52 | #define CPUTYPE_SKYLAKEX 52 | ||||
| #define CPUTYPE_DHYANA 53 | |||||
| #define CPUTYPE_HYGON_UNKNOWN 54 | |||||
| #endif | #endif | ||||
| @@ -271,6 +271,7 @@ int get_vendor(void){ | |||||
| if (!strcmp(vendor, " SiS SiS SiS")) return VENDOR_SIS; | if (!strcmp(vendor, " SiS SiS SiS")) return VENDOR_SIS; | ||||
| if (!strcmp(vendor, "GenuineTMx86")) return VENDOR_TRANSMETA; | if (!strcmp(vendor, "GenuineTMx86")) return VENDOR_TRANSMETA; | ||||
| if (!strcmp(vendor, "Geode by NSC")) return VENDOR_NSC; | if (!strcmp(vendor, "Geode by NSC")) return VENDOR_NSC; | ||||
| if (!strcmp(vendor, "HygonGenuine")) return VENDOR_HYGON; | |||||
| if ((eax == 0) || ((eax & 0x500) != 0)) return VENDOR_INTEL; | if ((eax == 0) || ((eax & 0x500) != 0)) return VENDOR_INTEL; | ||||
| @@ -1046,7 +1047,9 @@ int get_cacheinfo(int type, cache_info_t *cacheinfo){ | |||||
| } | } | ||||
| } | } | ||||
| if ((get_vendor() == VENDOR_AMD) || (get_vendor() == VENDOR_CENTAUR)) { | |||||
| if ((get_vendor() == VENDOR_AMD) || | |||||
| (get_vendor() == VENDOR_HYGON) || | |||||
| (get_vendor() == VENDOR_CENTAUR)) { | |||||
| cpuid(0x80000005, &eax, &ebx, &ecx, &edx); | cpuid(0x80000005, &eax, &ebx, &ecx, &edx); | ||||
| LDTB.size = 4096; | LDTB.size = 4096; | ||||
| @@ -1483,6 +1486,26 @@ int get_cpuname(void){ | |||||
| return CPUTYPE_AMD_UNKNOWN; | return CPUTYPE_AMD_UNKNOWN; | ||||
| } | } | ||||
| if (vendor == VENDOR_HYGON){ | |||||
| switch (family) { | |||||
| case 0xf: | |||||
| switch (exfamily) { | |||||
| case 9: | |||||
| //Hygon Dhyana | |||||
| if(support_avx()) | |||||
| #ifndef NO_AVX2 | |||||
| return CPUTYPE_ZEN; | |||||
| #else | |||||
| return CPUTYPE_SANDYBRIDGE; // closer in architecture to Sandy Bridge than to Excavator | |||||
| #endif | |||||
| else | |||||
| return CPUTYPE_BARCELONA; | |||||
| } | |||||
| break; | |||||
| } | |||||
| return CPUTYPE_HYGON_UNKNOWN; | |||||
| } | |||||
| if (vendor == VENDOR_CYRIX){ | if (vendor == VENDOR_CYRIX){ | ||||
| switch (family) { | switch (family) { | ||||
| case 0x4: | case 0x4: | ||||
| @@ -1604,7 +1627,8 @@ static char *cpuname[] = { | |||||
| "STEAMROLLER", | "STEAMROLLER", | ||||
| "EXCAVATOR", | "EXCAVATOR", | ||||
| "ZEN", | "ZEN", | ||||
| "SKYLAKEX" | |||||
| "SKYLAKEX", | |||||
| "DHYANA" | |||||
| }; | }; | ||||
| static char *lowercpuname[] = { | static char *lowercpuname[] = { | ||||
| @@ -1659,7 +1683,8 @@ static char *lowercpuname[] = { | |||||
| "steamroller", | "steamroller", | ||||
| "excavator", | "excavator", | ||||
| "zen", | "zen", | ||||
| "skylakex" | |||||
| "skylakex", | |||||
| "dhyana" | |||||
| }; | }; | ||||
| static char *corename[] = { | static char *corename[] = { | ||||
| @@ -1691,7 +1716,8 @@ static char *corename[] = { | |||||
| "STEAMROLLER", | "STEAMROLLER", | ||||
| "EXCAVATOR", | "EXCAVATOR", | ||||
| "ZEN", | "ZEN", | ||||
| "SKYLAKEX" | |||||
| "SKYLAKEX", | |||||
| "DHYANA" | |||||
| }; | }; | ||||
| static char *corename_lower[] = { | static char *corename_lower[] = { | ||||
| @@ -1723,7 +1749,8 @@ static char *corename_lower[] = { | |||||
| "steamroller", | "steamroller", | ||||
| "excavator", | "excavator", | ||||
| "zen", | "zen", | ||||
| "skylakex" | |||||
| "skylakex", | |||||
| "dhyana" | |||||
| }; | }; | ||||
| @@ -2040,6 +2067,23 @@ int get_coretype(void){ | |||||
| } | } | ||||
| } | } | ||||
| if (vendor == VENDOR_HYGON){ | |||||
| if (family == 0xf){ | |||||
| if (exfamily == 9) { | |||||
| if(support_avx()) | |||||
| #ifndef NO_AVX2 | |||||
| return CORE_ZEN; | |||||
| #else | |||||
| return CORE_SANDYBRIDGE; // closer in architecture to Sandy Bridge than to Excavator | |||||
| #endif | |||||
| else | |||||
| return CORE_BARCELONA; | |||||
| } else { | |||||
| return CORE_BARCELONA; | |||||
| } | |||||
| } | |||||
| } | |||||
| if (vendor == VENDOR_CENTAUR) { | if (vendor == VENDOR_CENTAUR) { | ||||
| switch (family) { | switch (family) { | ||||
| case 0x6: | case 0x6: | ||||
| @@ -274,6 +274,7 @@ extern gotoblas_t gotoblas_SKYLAKEX; | |||||
| #define VENDOR_INTEL 1 | #define VENDOR_INTEL 1 | ||||
| #define VENDOR_AMD 2 | #define VENDOR_AMD 2 | ||||
| #define VENDOR_CENTAUR 3 | #define VENDOR_CENTAUR 3 | ||||
| #define VENDOR_HYGON 4 | |||||
| #define VENDOR_UNKNOWN 99 | #define VENDOR_UNKNOWN 99 | ||||
| #define BITMASK(a, b, c) ((((a) >> (b)) & (c))) | #define BITMASK(a, b, c) ((((a) >> (b)) & (c))) | ||||
| @@ -369,6 +370,7 @@ static int get_vendor(void){ | |||||
| if (!strcmp(vendor.vchar, "GenuineIntel")) return VENDOR_INTEL; | if (!strcmp(vendor.vchar, "GenuineIntel")) return VENDOR_INTEL; | ||||
| if (!strcmp(vendor.vchar, "AuthenticAMD")) return VENDOR_AMD; | if (!strcmp(vendor.vchar, "AuthenticAMD")) return VENDOR_AMD; | ||||
| if (!strcmp(vendor.vchar, "CentaurHauls")) return VENDOR_CENTAUR; | if (!strcmp(vendor.vchar, "CentaurHauls")) return VENDOR_CENTAUR; | ||||
| if (!strcmp(vendor.vchar, "HygonGenuine")) return VENDOR_HYGON; | |||||
| if ((eax == 0) || ((eax & 0x500) != 0)) return VENDOR_INTEL; | if ((eax == 0) || ((eax & 0x500) != 0)) return VENDOR_INTEL; | ||||
| @@ -604,7 +606,7 @@ static gotoblas_t *get_coretype(void){ | |||||
| } | } | ||||
| } | } | ||||
| if (vendor == VENDOR_AMD){ | |||||
| if (vendor == VENDOR_AMD || vendor == VENDOR_HYGON){ | |||||
| if (family <= 0xe) { | if (family <= 0xe) { | ||||
| // Verify that CPU has 3dnow and 3dnowext before claiming it is Athlon | // Verify that CPU has 3dnow and 3dnowext before claiming it is Athlon | ||||
| cpuid(0x80000000, &eax, &ebx, &ecx, &edx); | cpuid(0x80000000, &eax, &ebx, &ecx, &edx); | ||||
| @@ -684,6 +686,13 @@ static gotoblas_t *get_coretype(void){ | |||||
| return &gotoblas_BARCELONA; //OS doesn't support AVX. Use old kernels. | return &gotoblas_BARCELONA; //OS doesn't support AVX. Use old kernels. | ||||
| } | } | ||||
| } | } | ||||
| } else if (exfamily == 9) { | |||||
| if(support_avx()) | |||||
| return &gotoblas_ZEN; | |||||
| else{ | |||||
| openblas_warning(FALLBACK_VERBOSE, BARCELONA_FALLBACK); | |||||
| return &gotoblas_BARCELONA; //OS doesn't support AVX. Use old kernels. | |||||
| } | |||||
| }else { | }else { | ||||
| return &gotoblas_BARCELONA; | return &gotoblas_BARCELONA; | ||||
| } | } | ||||