shithub: libvpx

Download patch

ref: 0f5c63e4f6fce8e846d799ad60b0c0d1895069f8
parent: e50f5d40376b3817fa2bf2e2b2fdf8a0084c3460
author: Fritz Koenig <frkoenig@google.com>
date: Tue Oct 12 10:55:31 EDT 2010

Add processor dectection for x86.

Use cpuid to check the vendor string against known
architectures.

Change-Id: I3fbd7f73638d71857a0c4a44a6275eb295fb4cef

--- a/libs.mk
+++ b/libs.mk
@@ -91,6 +91,7 @@
 CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/emms.asm
 CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/x86.h
 CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/x86_abi_support.asm
+CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/x86_cpuid.c
 endif
 CODEC_SRCS-$(ARCH_ARM) += $(BUILD_PFX)vpx_config.asm
 CODEC_EXPORTS-$(BUILD_LIBVPX) += vpx/exports_com
--- a/vpx_ports/x86.h
+++ b/vpx_ports/x86.h
@@ -14,6 +14,26 @@
 #include <stdlib.h>
 #include "config.h"
 
+typedef enum
+{
+    VPX_CPU_UNKNOWN = -1,
+    VPX_CPU_AMD,
+    VPX_CPU_AMD_OLD,
+    VPX_CPU_CENTAUR,
+    VPX_CPU_CYRIX,
+    VPX_CPU_INTEL,
+    VPX_CPU_NEXGEN,
+    VPX_CPU_NSC,
+    VPX_CPU_RISE,
+    VPX_CPU_SIS,
+    VPX_CPU_TRANSMETA,
+    VPX_CPU_TRANSMETA_OLD,
+    VPX_CPU_UMC,
+    VPX_CPU_VIA,
+
+    VPX_CPU_LAST
+}  vpx_cpu_t;
+
 #if defined(__GNUC__) && __GNUC__
 #if ARCH_X86_64
 #define cpuid(func,ax,bx,cx,dx)\
@@ -100,6 +120,7 @@
     return flags & mask;
 }
 
+vpx_cpu_t vpx_x86_vendor(void);
 
 #if ARCH_X86_64 && defined(_MSC_VER)
 unsigned __int64 __rdtsc(void);
--- /dev/null
+++ b/vpx_ports/x86_cpuid.c
@@ -1,0 +1,53 @@
+/*
+ *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include <string.h>
+#include "x86.h"
+
+struct cpuid_vendors
+{
+    char vendor_string[12];
+    vpx_cpu_t vendor_id;
+};
+
+static struct cpuid_vendors cpuid_vendor_list[VPX_CPU_LAST] =
+{
+    { "AuthenticAMD", VPX_CPU_AMD           },
+    { "AMDisbetter!", VPX_CPU_AMD_OLD       },
+    { "CentaurHauls", VPX_CPU_CENTAUR       },
+    { "CyrixInstead", VPX_CPU_CYRIX         },
+    { "GenuineIntel", VPX_CPU_INTEL         },
+    { "NexGenDriven", VPX_CPU_NEXGEN        },
+    { "Geode by NSC", VPX_CPU_NSC           },
+    { "RiseRiseRise", VPX_CPU_RISE          },
+    { "SiS SiS SiS ", VPX_CPU_SIS           },
+    { "GenuineTMx86", VPX_CPU_TRANSMETA     },
+    { "TransmetaCPU", VPX_CPU_TRANSMETA_OLD },
+    { "UMC UMC UMC ", VPX_CPU_UMC           },
+    { "VIA VIA VIA ", VPX_CPU_VIA           },
+};
+
+vpx_cpu_t vpx_x86_vendor(void)
+{
+    unsigned int reg_eax;
+    unsigned int vs[3];
+    int i;
+
+    /* Get the Vendor String from the CPU */
+    cpuid(0, reg_eax, vs[0], vs[2], vs[1]);
+
+    for (i = 0; i < VPX_CPU_LAST; i++)
+    {
+        if (strncmp ((const char *)vs, cpuid_vendor_list[i].vendor_string, 12) == 0)
+           return (cpuid_vendor_list[i].vendor_id);
+    }
+
+    return VPX_CPU_UNKNOWN;
+}