Index: third_party/lzma_sdk/CpuArch.c |
diff --git a/third_party/lzma_sdk/CpuArch.c b/third_party/lzma_sdk/CpuArch.c |
index 16169590cb4e3513bc24b3abf912689b4539714f..edb6b08559914569c07997b6bcd867bf4817b6c7 100644 |
--- a/third_party/lzma_sdk/CpuArch.c |
+++ b/third_party/lzma_sdk/CpuArch.c |
@@ -1,5 +1,7 @@ |
/* CpuArch.c -- CPU specific code |
-2010-10-26: Igor Pavlov : Public domain */ |
+2015-03-25: Igor Pavlov : Public domain */ |
+ |
+#include "Precomp.h" |
#include "CpuArch.h" |
@@ -9,6 +11,10 @@ |
#define USE_ASM |
#endif |
+#if !defined(USE_ASM) && _MSC_VER >= 1500 |
+#include <intrin.h> |
+#endif |
+ |
#if defined(USE_ASM) && !defined(MY_CPU_AMD64) |
static UInt32 CheckFlag(UInt32 flag) |
{ |
@@ -49,7 +55,7 @@ static UInt32 CheckFlag(UInt32 flag) |
#define CHECK_CPUID_IS_SUPPORTED |
#endif |
-static void MyCPUID(UInt32 function, UInt32 *a, UInt32 *b, UInt32 *c, UInt32 *d) |
+void MyCPUID(UInt32 function, UInt32 *a, UInt32 *b, UInt32 *c, UInt32 *d) |
{ |
#ifdef USE_ASM |
@@ -73,33 +79,29 @@ static void MyCPUID(UInt32 function, UInt32 *a, UInt32 *b, UInt32 *c, UInt32 *d) |
#else |
- #if defined(MY_CPU_AMD64) |
- |
__asm__ __volatile__ ( |
+ #if defined(MY_CPU_AMD64) |
"mov %%rbx, %%rdi\n" |
"cpuid\n" |
"xchg %%rdi, %%rbx\n" |
: "=a" (*a) , |
"=D" (*b) , |
- "=c" (*c) , |
- "=d" (*d) |
- : "0" (function)) ; |
- |
- #else |
- |
- __asm__ __volatile__ ( |
- "mov %%ebx, %%edi\n" |
- "cpuid\n" |
- "xchg %%edi, %%ebx\n" |
+ #elif defined(MY_CPU_X86) && defined(__PIC__) |
+ "mov %%ebx, %%edi;" |
+ "cpuid;" |
+ "xchgl %%ebx, %%edi;" |
: "=a" (*a) , |
"=D" (*b) , |
+ #else |
+ "cpuid" |
+ : "=a" (*a) , |
+ "=b" (*b) , |
+ #endif |
"=c" (*c) , |
"=d" (*d) |
: "0" (function)) ; |
#endif |
- |
- #endif |
#else |
@@ -121,7 +123,7 @@ Bool x86cpuid_CheckAndRead(Cx86cpuid *p) |
return True; |
} |
-static UInt32 kVendors[][3] = |
+static const UInt32 kVendors[][3] = |
{ |
{ 0x756E6547, 0x49656E69, 0x6C65746E}, |
{ 0x68747541, 0x69746E65, 0x444D4163}, |
@@ -149,12 +151,22 @@ Bool CPU_Is_InOrder() |
UInt32 family, model; |
if (!x86cpuid_CheckAndRead(&p)) |
return True; |
- family = x86cpuid_GetFamily(&p); |
- model = x86cpuid_GetModel(&p); |
+ |
+ family = x86cpuid_GetFamily(p.ver); |
+ model = x86cpuid_GetModel(p.ver); |
+ |
firm = x86cpuid_GetFirm(&p); |
+ |
switch (firm) |
{ |
- case CPU_FIRM_INTEL: return (family < 6 || (family == 6 && model == 0x100C)); |
+ case CPU_FIRM_INTEL: return (family < 6 || (family == 6 && ( |
+ /* In-Order Atom CPU */ |
+ model == 0x1C /* 45 nm, N4xx, D4xx, N5xx, D5xx, 230, 330 */ |
+ || model == 0x26 /* 45 nm, Z6xx */ |
+ || model == 0x27 /* 32 nm, Z2460 */ |
+ || model == 0x35 /* 32 nm, Z2760 */ |
+ || model == 0x36 /* 32 nm, N2xxx, D2xxx */ |
+ ))); |
case CPU_FIRM_AMD: return (family < 5 || (family == 5 && (model < 6 || model == 0xA))); |
case CPU_FIRM_VIA: return (family < 6 || (family == 6 && model < 0xF)); |
} |
@@ -162,6 +174,7 @@ Bool CPU_Is_InOrder() |
} |
#if !defined(MY_CPU_AMD64) && defined(_WIN32) |
+#include <windows.h> |
static Bool CPU_Sys_Is_SSE_Supported() |
{ |
OSVERSIONINFO vi; |