--- a/tools/archopt.c.old
+++ b/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);
 }
