| @@ -116,18 +116,24 @@ extern void openblas_warning(int verbose, const char * msg); | |||||
| static int get_vendor(void){ | static int get_vendor(void){ | ||||
| int eax, ebx, ecx, edx; | int eax, ebx, ecx, edx; | ||||
| char vendor[13]; | |||||
| union | |||||
| { | |||||
| char vchar[16]; | |||||
| int vint[4]; | |||||
| } vendor; | |||||
| cpuid(0, &eax, &ebx, &ecx, &edx); | cpuid(0, &eax, &ebx, &ecx, &edx); | ||||
| *(int *)(&vendor[0]) = ebx; | |||||
| *(int *)(&vendor[4]) = edx; | |||||
| *(int *)(&vendor[8]) = ecx; | |||||
| vendor[12] = (char)0; | |||||
| if (!strcmp(vendor, "GenuineIntel")) return VENDOR_INTEL; | |||||
| if (!strcmp(vendor, "AuthenticAMD")) return VENDOR_AMD; | |||||
| if (!strcmp(vendor, "CentaurHauls")) return VENDOR_CENTAUR; | |||||
| *(&vendor.vint[0]) = ebx; | |||||
| *(&vendor.vint[1]) = edx; | |||||
| *(&vendor.vint[2]) = ecx; | |||||
| vendor.vchar[12] = '\0'; | |||||
| if (!strcmp(vendor.vchar, "GenuineIntel")) return VENDOR_INTEL; | |||||
| if (!strcmp(vendor.vchar, "AuthenticAMD")) return VENDOR_AMD; | |||||
| if (!strcmp(vendor.vchar, "CentaurHauls")) return VENDOR_CENTAUR; | |||||
| if ((eax == 0) || ((eax & 0x500) != 0)) return VENDOR_INTEL; | if ((eax == 0) || ((eax & 0x500) != 0)) return VENDOR_INTEL; | ||||
| @@ -232,7 +238,7 @@ static gotoblas_t *get_coretype(void){ | |||||
| 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); | ||||
| if (eax & 0xffff >= 0x01) { | |||||
| if ( (eax & 0xffff) >= 0x01) { | |||||
| cpuid(0x80000001, &eax, &ebx, &ecx, &edx); | cpuid(0x80000001, &eax, &ebx, &ecx, &edx); | ||||
| if ((edx & (1 << 30)) == 0 || (edx & (1 << 31)) == 0) | if ((edx & (1 << 30)) == 0 || (edx & (1 << 31)) == 0) | ||||
| return NULL; | return NULL; | ||||