| @@ -318,75 +318,83 @@ static gotoblas_t *get_coretype(void){ | |||||
| } | } | ||||
| if (vendor == VENDOR_AMD){ | if (vendor == VENDOR_AMD){ | ||||
| if (family <= 0xe) { | |||||
| // Verify that CPU has 3dnow and 3dnowext before claiming it is Athlon | |||||
| cpuid(0x80000000, &eax, &ebx, &ecx, &edx); | |||||
| if ( (eax & 0xffff) >= 0x01) { | |||||
| cpuid(0x80000001, &eax, &ebx, &ecx, &edx); | |||||
| if ((edx & (1 << 30)) == 0 || (edx & (1 << 31)) == 0) | |||||
| return NULL; | |||||
| if (family <= 0xe) { | |||||
| // Verify that CPU has 3dnow and 3dnowext before claiming it is Athlon | |||||
| cpuid(0x80000000, &eax, &ebx, &ecx, &edx); | |||||
| if ( (eax & 0xffff) >= 0x01) { | |||||
| cpuid(0x80000001, &eax, &ebx, &ecx, &edx); | |||||
| if ((edx & (1 << 30)) == 0 || (edx & (1 << 31)) == 0) | |||||
| return NULL; | |||||
| } | } | ||||
| else | |||||
| return NULL; | |||||
| else | |||||
| return NULL; | |||||
| return &gotoblas_ATHLON; | |||||
| return &gotoblas_ATHLON; | |||||
| } | } | ||||
| if (family == 0xf){ | |||||
| if ((exfamily == 0) || (exfamily == 2)) { | |||||
| if (ecx & (1 << 0)) return &gotoblas_OPTERON_SSE3; | |||||
| else return &gotoblas_OPTERON; | |||||
| } else if (exfamily == 5) { | |||||
| return &gotoblas_BOBCAT; | |||||
| } else if (exfamily == 6) { | |||||
| if(model == 1){ | |||||
| //AMD Bulldozer Opteron 6200 / Opteron 4200 / AMD FX-Series | |||||
| if(support_avx()) | |||||
| return &gotoblas_BULLDOZER; | |||||
| else{ | |||||
| openblas_warning(FALLBACK_VERBOSE, BARCELONA_FALLBACK); | |||||
| return &gotoblas_BARCELONA; //OS doesn't support AVX. Use old kernels. | |||||
| } | |||||
| }else if(model == 2 || model == 3){ | |||||
| //AMD Bulldozer Opteron 6300 / Opteron 4300 / Opteron 3300 | |||||
| if(support_avx()) | |||||
| return &gotoblas_PILEDRIVER; | |||||
| else{ | |||||
| openblas_warning(FALLBACK_VERBOSE, BARCELONA_FALLBACK); | |||||
| return &gotoblas_BARCELONA; //OS doesn't support AVX. Use old kernels. | |||||
| } | |||||
| }else if(model == 0){ | |||||
| if (exmodel == 1) { | |||||
| //AMD Trinity | |||||
| if(support_avx()) | |||||
| return &gotoblas_PILEDRIVER; | |||||
| else{ | |||||
| openblas_warning(FALLBACK_VERBOSE, BARCELONA_FALLBACK); | |||||
| return &gotoblas_BARCELONA; //OS doesn't support AVX. Use old kernels. | |||||
| } | |||||
| }else if (exmodel == 3) { | |||||
| //AMD STEAMROLLER | |||||
| if(support_avx()) | |||||
| return &gotoblas_STEAMROLLER; | |||||
| else{ | |||||
| openblas_warning(FALLBACK_VERBOSE, BARCELONA_FALLBACK); | |||||
| return &gotoblas_BARCELONA; //OS doesn't support AVX. Use old kernels. | |||||
| } | |||||
| }else if (exmodel == 6) { | |||||
| if(support_avx()) | |||||
| return &gotoblas_EXCAVATOR; | |||||
| else{ | |||||
| openblas_warning(FALLBACK_VERBOSE, BARCELONA_FALLBACK); | |||||
| return &gotoblas_BARCELONA; //OS doesn't support AVX. Use old kernels. | |||||
| } | |||||
| } | |||||
| } | |||||
| } else { | |||||
| return &gotoblas_BARCELONA; | |||||
| if (family == 0xf){ | |||||
| if ((exfamily == 0) || (exfamily == 2)) { | |||||
| if (ecx & (1 << 0)) return &gotoblas_OPTERON_SSE3; | |||||
| else return &gotoblas_OPTERON; | |||||
| } else if (exfamily == 5) { | |||||
| return &gotoblas_BOBCAT; | |||||
| } else if (exfamily == 6) { | |||||
| if(model == 1){ | |||||
| //AMD Bulldozer Opteron 6200 / Opteron 4200 / AMD FX-Series | |||||
| if(support_avx()) | |||||
| return &gotoblas_BULLDOZER; | |||||
| else{ | |||||
| openblas_warning(FALLBACK_VERBOSE, BARCELONA_FALLBACK); | |||||
| return &gotoblas_BARCELONA; //OS doesn't support AVX. Use old kernels. | |||||
| } | |||||
| }else if(model == 2 || model == 3){ | |||||
| //AMD Bulldozer Opteron 6300 / Opteron 4300 / Opteron 3300 | |||||
| if(support_avx()) | |||||
| return &gotoblas_PILEDRIVER; | |||||
| else{ | |||||
| openblas_warning(FALLBACK_VERBOSE, BARCELONA_FALLBACK); | |||||
| return &gotoblas_BARCELONA; //OS doesn't support AVX. Use old kernels. | |||||
| } | |||||
| }else if(model == 5) { // EXCAVATOR | |||||
| if(support_avx()) | |||||
| return &gotoblas_EXCAVATOR; | |||||
| else{ | |||||
| openblas_warning(FALLBACK_VERBOSE, BARCELONA_FALLBACK); | |||||
| return &gotoblas_BARCELONA; //OS doesn't support AVX. Use old kernels. | |||||
| } | |||||
| }else if(model == 0){ | |||||
| if (exmodel == 1) { | |||||
| //AMD Trinity | |||||
| if(support_avx()) | |||||
| return &gotoblas_PILEDRIVER; | |||||
| else{ | |||||
| openblas_warning(FALLBACK_VERBOSE, BARCELONA_FALLBACK); | |||||
| return &gotoblas_BARCELONA; //OS doesn't support AVX. Use old kernels. | |||||
| } | |||||
| }else if (exmodel == 3) { | |||||
| //AMD STEAMROLLER | |||||
| if(support_avx()) | |||||
| return &gotoblas_STEAMROLLER; | |||||
| else{ | |||||
| openblas_warning(FALLBACK_VERBOSE, BARCELONA_FALLBACK); | |||||
| return &gotoblas_BARCELONA; //OS doesn't support AVX. Use old kernels. | |||||
| } | |||||
| }else if (exmodel == 6) { | |||||
| if(support_avx()) | |||||
| return &gotoblas_EXCAVATOR; | |||||
| else{ | |||||
| openblas_warning(FALLBACK_VERBOSE, BARCELONA_FALLBACK); | |||||
| return &gotoblas_BARCELONA; //OS doesn't support AVX. Use old kernels. | |||||
| } | |||||
| } | |||||
| } | |||||
| } else { | |||||
| return &gotoblas_BARCELONA; | |||||
| } | |||||
| } | } | ||||
| } | |||||
| } | } | ||||
| if (vendor == VENDOR_CENTAUR) { | if (vendor == VENDOR_CENTAUR) { | ||||