| --- tools/archopt.c.old |
| +++ tools/archopt.c |
| @@ -1,8 +1,30 @@ |
| +/* |
| +Copyright (C) 2005-2007 Nach, grinvader ( http://www.zsnes.com ) |
| + |
| +This program is free software; you can redistribute it and/or |
| +modify it under the terms of the GNU General Public License |
| +version 2 as published by the Free Software Foundation. |
| + |
| +This program is distributed in the hope that it will be useful, |
| +but WITHOUT ANY WARRANTY; without even the implied warranty of |
| +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| +GNU General Public License for more details. |
| + |
| +You should have received a copy of the GNU General Public License |
| +along with this program; if not, write to the Free Software |
| +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
| +*/ |
| + |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <ctype.h> |
| |
| +#ifdef _M_X64 |
| +#define __x86_64__ |
| +#endif |
| + |
| +#ifdef __GNUC__ |
| #ifdef __x86_64__ |
| #define cpuid(in, a, b, c, d) asm volatile("cpuid": "=a" (a), "=b" (b), "=c" (c), "=d" (d) : "a" (in)); |
| #else |
| @@ -13,6 +35,22 @@ |
| movl %%ebx,%%edi;\ |
| popl %%ebx": "=a" (a), "=D" (b), "=c" (c), "=d" (d) : "a" (in)); |
| #endif |
| +#else |
| +char cpubuf[256]; |
| +int z_in, z_a, z_b, z_c, z_d; |
| +void cpuid_run() |
| +{ |
| + _asm { |
| + mov eax,z_in |
| + cpuid |
| + mov z_a,eax |
| + mov z_b,ebx |
| + mov z_c,ecx |
| + mov z_d,edx |
| + }; |
| +} |
| +#define cpuid(in, a, b, c, d) z_in = in; cpuid_run(); a = z_a; b = z_b; c = z_c; d = z_d; |
| +#endif |
| |
| char *x86_flags[] = |
| { "fpu", "vme", "de", "pse", "tsc", "msr", "pae", "mce", |
| @@ -62,6 +100,7 @@ |
| { |
| int have = 0x200000; |
| #ifndef __x86_64__ |
| + #ifdef __GNUC__ |
| asm volatile |
| ( |
| " pushfl;" |
| @@ -76,6 +115,23 @@ |
| : "=a" (have) |
| : "c" (have) |
| ); |
| + #else |
| + z_c = have; |
| + _asm { |
| + mov ecx,z_c |
| + pushfd |
| + pop eax |
| + mov edx,eax |
| + xor eax,ecx |
| + push eax |
| + popfd |
| + pushfd |
| + pop eax |
| + xor eax,edx |
| + mov z_a,eax |
| + }; |
| + have = z_a; |
| + #endif |
| #endif |
| return(have); |
| } |
| @@ -196,238 +252,268 @@ |
| cpu = "native"; |
| #endif |
| #endif |
| - |
| - if (!cpu && *cpu_family && *vendor_id) |
| + if (!cpu) |
| { |
| - if (!strcmp(vendor_id, "AuthenticAMD") || strstr(model_name, "AMD")) |
| + if (!cpu && *cpu_family && *vendor_id) |
| { |
| - if (strstr(flags, " mmx ")) |
| + #ifdef __GNUC__ |
| + if (!strcmp(vendor_id, "AuthenticAMD") || strstr(model_name, "AMD")) |
| { |
| - #if __GNUC__ > 2 |
| - if (strstr(flags, " 3dnow ")) |
| + if (strstr(flags, " mmx ")) |
| { |
| - if (strstr(flags, " 3dnowext ") && (atoi(cpu_family) > 5)) |
| + #if __GNUC__ > 2 |
| + if (strstr(flags, " 3dnow ")) |
| { |
| - #if __GNUC__ > 3 || __GNUC_MINOR__ > 0 |
| - if (strstr(flags, " sse ")) |
| + if (strstr(flags, " 3dnowext ") && (atoi(cpu_family) > 5)) |
| { |
| - #if __GNUC__ > 3 || __GNUC_MINOR__ > 3 |
| - if (strstr(flags, " sse2 ") && strstr(flags, " lm ")) //Need two checks to protect Semprons |
| + #if __GNUC__ > 3 || __GNUC_MINOR__ > 0 |
| + if (strstr(flags, " sse ")) |
| { |
| - if (strstr(model_name, "Opteron")) |
| - { |
| - cpu = "opteron"; |
| - } |
| - else if (strstr(model_name, "Athlon(tm) 64")) //Also athlon-fx |
| + #if __GNUC__ > 3 || __GNUC_MINOR__ > 3 |
| + if (strstr(flags, " sse2 ") && strstr(flags, " lm ")) //Need two checks to protect Semprons |
| { |
| - cpu = "athlon64"; |
| + if (strstr(model_name, "Opteron")) |
| + { |
| + cpu = "opteron"; |
| + } |
| + else if (strstr(model_name, "Athlon(tm) 64")) //Also athlon-fx |
| + { |
| + cpu = "athlon64"; |
| + } |
| + else |
| + { |
| + cpu = "k8"; |
| + } |
| } |
| - else |
| + #endif |
| + if (!cpu) |
| { |
| - cpu = "k8"; |
| + if (strstr(model_name, "Athlon(tm) 4")) |
| + { |
| + cpu = "athlon-4"; |
| + } |
| + else if (strstr(model_name, "Athlon(tm) MP")) |
| + { |
| + cpu = "athlon-mp"; |
| + } |
| + else |
| + { |
| + cpu = "athlon-xp"; |
| + } |
| } |
| } |
| + |
| + if (!cpu && (atoi(model) > 3)) |
| + { |
| + cpu = "athlon-tbird"; |
| + } |
| #endif |
| + |
| if (!cpu) |
| { |
| - if (strstr(model_name, "Athlon(tm) 4")) |
| - { |
| - cpu = "athlon-4"; |
| - } |
| - else if (strstr(model_name, "Athlon(tm) MP")) |
| - { |
| - cpu = "athlon-mp"; |
| - } |
| - else |
| - { |
| - cpu = "athlon-xp"; |
| - } |
| + cpu = "athlon"; |
| } |
| } |
| |
| - if (!cpu && (atoi(model) > 3)) |
| - { |
| - cpu = "athlon-tbird"; |
| - } |
| - #endif |
| - |
| + #if __GNUC__ > 3 || __GNUC_MINOR__ > 0 |
| if (!cpu) |
| { |
| - cpu = "athlon"; |
| + int model_num = atoi(model); |
| + if ((model_num == 9) || (model_num >= 13)) |
| + { |
| + cpu = "k6-3"; |
| + } |
| + else |
| + { |
| + cpu = "k6-2"; |
| + } |
| } |
| + #endif |
| } |
| + #endif |
| |
| - #if __GNUC__ > 3 || __GNUC_MINOR__ > 0 |
| if (!cpu) |
| { |
| - int model_num = atoi(model); |
| - if ((model_num == 9) || (model_num >= 13)) |
| - { |
| - cpu = "k6-3"; |
| - } |
| - else |
| - { |
| - cpu = "k6-2"; |
| - } |
| + cpu = "k6"; |
| } |
| - #endif |
| - } |
| - #endif |
| - |
| - if (!cpu) |
| - { |
| - cpu = "k6"; |
| } |
| } |
| - } |
| - else if (!strcmp(vendor_id, "GenuineIntel") || strstr(model_name, "Intel")) |
| - { |
| - #if __GNUC__ > 2 |
| - if (strstr(flags, " mmx ")) |
| + else if (!strcmp(vendor_id, "GenuineIntel") || strstr(model_name, "Intel")) |
| { |
| - if (strstr(flags, " sse ")) |
| + #if __GNUC__ > 2 |
| + if (strstr(flags, " mmx ")) |
| { |
| - if (strstr(flags, " sse2 ")) |
| + if (strstr(flags, " sse ")) |
| { |
| - #if __GNUC__ > 3 || __GNUC_MINOR__ > 2 |
| - if (strstr(flags, " pni ") && strcmp(cpu_family, "6")) |
| + if (strstr(flags, " sse2 ")) |
| { |
| - if (strstr(flags, " lm ")) |
| + #if __GNUC__ > 3 || __GNUC_MINOR__ > 2 |
| + if (strstr(flags, " pni ") && strcmp(cpu_family, "6")) |
| { |
| - cpu = "nocona"; |
| + if (strstr(flags, " lm ")) |
| + { |
| + cpu = "nocona"; |
| + } |
| + else |
| + { |
| + cpu = "prescott"; |
| + } |
| } |
| - else |
| + #endif |
| + |
| + if (!cpu) |
| { |
| - cpu = "prescott"; |
| + if (!strcmp(cpu_family, "6")) |
| + { |
| + #if __GNUC__ > 3 || __GNUC_MINOR__ > 3 |
| + cpu = "pentium-m"; |
| + #else |
| + cpu = "pentium3"; |
| + #endif |
| + } |
| + else |
| + { |
| + #if __GNUC__ > 3 || __GNUC_MINOR__ > 3 |
| + if (strstr(model_name, "Mobile")) |
| + { |
| + cpu = "pentium4m"; |
| + } |
| + #endif |
| + |
| + if (!cpu) |
| + { |
| + cpu = "pentium4"; |
| + } |
| + } |
| } |
| } |
| - #endif |
| - |
| - if (!cpu) |
| + else |
| { |
| - if (!strcmp(cpu_family, "6")) |
| + #if __GNUC__ > 3 || __GNUC_MINOR__ > 3 |
| + if (strstr(model_name, "Mobile")) |
| { |
| - #if __GNUC__ > 3 || __GNUC_MINOR__ > 3 |
| - cpu = "pentium-m"; |
| - #else |
| - cpu = "pentium3"; |
| - #endif |
| + cpu = "pentium3m"; |
| } |
| - else |
| - { |
| - #if __GNUC__ > 3 || __GNUC_MINOR__ > 3 |
| - if (strstr(model_name, "Mobile")) |
| - { |
| - cpu = "pentium4m"; |
| - } |
| - #endif |
| + #endif |
| |
| - if (!cpu) |
| - { |
| - cpu = "pentium4"; |
| - } |
| + if (!cpu) |
| + { |
| + cpu = "pentium3"; |
| } |
| } |
| } |
| else |
| { |
| - #if __GNUC__ > 3 || __GNUC_MINOR__ > 3 |
| - if (strstr(model_name, "Mobile")) |
| + if (!strcmp(cpu_family, "6")) |
| { |
| - cpu = "pentium3m"; |
| + cpu = "pentium2"; |
| } |
| - #endif |
| - |
| - if (!cpu) |
| + else |
| { |
| - cpu = "pentium3"; |
| + cpu = "pentium-mmx"; |
| } |
| } |
| } |
| - else |
| + #endif |
| + |
| + if (!cpu) |
| + { |
| + int family = atoi(cpu_family); |
| + if (family > 5) |
| + { |
| + cpu = "pentiumpro"; |
| + } |
| + else if (family == 5) |
| + { |
| + cpu = "pentium"; |
| + } |
| + } |
| + } |
| + #if __GNUC__ > 2 |
| + #if __GNUC__ > 3 || __GNUC_MINOR__ > 2 |
| + else if (!strcmp(vendor_id, "CentaurHauls") && strstr(flags, " mmx ")) |
| + { |
| + if (strstr(flags, " 3dnow ")) |
| { |
| - if (!strcmp(cpu_family, "6")) |
| + if (atoi(cpu_family) > 5) |
| { |
| - cpu = "pentium2"; |
| + cpu = "c3"; |
| } |
| else |
| { |
| - cpu = "pentium-mmx"; |
| + cpu = "winchip2"; |
| } |
| } |
| + #if __GNUC__ > 3 || __GNUC_MINOR__ > 3 |
| + else if (strstr(flags, " sse ")) |
| + { |
| + cpu = "c3-2"; |
| + } |
| + #endif |
| + |
| + if (!cpu) |
| + { |
| + cpu = "winchip-c6"; |
| + } |
| } |
| #endif |
| + #endif |
| |
| if (!cpu) |
| { |
| int family = atoi(cpu_family); |
| if (family > 5) |
| { |
| - cpu = "pentiumpro"; |
| + cpu = "i686"; |
| } |
| else if (family == 5) |
| { |
| - cpu = "pentium"; |
| + cpu = "i586"; |
| } |
| - } |
| - } |
| - #if __GNUC__ > 2 |
| - #if __GNUC__ > 3 || __GNUC_MINOR__ > 2 |
| - else if (!strcmp(vendor_id, "CentaurHauls") && strstr(flags, " mmx ")) |
| - { |
| - if (strstr(flags, " 3dnow ")) |
| - { |
| - if (atoi(cpu_family) > 5) |
| + else if (family == 4) |
| { |
| - cpu = "c3"; |
| + cpu = "i486"; |
| } |
| else |
| { |
| - cpu = "winchip2"; |
| + cpu = "i386"; |
| } |
| } |
| - #if __GNUC__ > 3 || __GNUC_MINOR__ > 3 |
| + #else //MSVC |
| + cpu = cpubuf; |
| + *cpu = 0; |
| + |
| + if (strstr(flags, " sse2 ")) |
| + { |
| + strcat(cpu, " /arch:SSE2"); |
| + } |
| else if (strstr(flags, " sse ")) |
| { |
| - cpu = "c3-2"; |
| + strcat(cpu, " /arch:SSE"); |
| } |
| - #endif |
| |
| - if (!cpu) |
| + #ifdef __x86_64__ |
| + if (strstr(flags, " lm ")) //64 bit |
| { |
| - cpu = "winchip-c6"; |
| + if (!strcmp(vendor_id, "AuthenticAMD") || strstr(model_name, "AMD")) |
| + { |
| + strcat(cpu, " /favor:AMD64"); |
| + } |
| + else if (!strcmp(vendor_id, "GenuineIntel") || strstr(model_name, "Intel")) |
| + { |
| + strcat(cpu, " /favor:EM64T"); |
| + } |
| } |
| + #endif |
| + #endif |
| } |
| - #endif |
| - #endif |
| - |
| - if (!cpu) |
| + else |
| { |
| - int family = atoi(cpu_family); |
| - if (family > 5) |
| - { |
| - cpu = "i686"; |
| - } |
| - else if (family == 5) |
| - { |
| - cpu = "i586"; |
| - } |
| - else if (family == 4) |
| - { |
| - cpu = "i486"; |
| - } |
| - else |
| - { |
| - cpu = "i386"; |
| - } |
| + puts("Could not open /proc/cpuinfo, and CPUID instruction not available."); |
| + return(1); |
| } |
| - puts(cpu); |
| - } |
| - else |
| - { |
| - puts("Could not open /proc/cpuinfo, and CPUID instruction not available."); |
| - return(1); |
| } |
| + puts(cpu); |
| |
| return(0); |
| } |