# HG changeset patch # User rubidium # Date 2014-01-02 18:52:54 # Node ID bb3972c9fc845cd7264c9ba7156c4979f01bbe54 # Parent 652ccbb04bc8b2bc5b5ddd514775906fe029b791 (svn r26207) -Codechange: move the CPUID flag detection into cpu.cpp diff --git a/src/cpu.cpp b/src/cpu.cpp --- a/src/cpu.cpp +++ b/src/cpu.cpp @@ -7,9 +7,10 @@ * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . */ -/** @file cpu.cpp OS/CPU/compiler dependant real time tick sampling. */ +/** @file cpu.cpp OS/CPU/compiler dependant CPU specific calls. */ #include "stdafx.h" +#include "core/bitmath_func.hpp" #undef RDTSC_AVAILABLE @@ -107,3 +108,14 @@ void ottd_cpuid(int info[4], int type) info[0] = info[1] = info[2] = info[3] = 0; } #endif + +bool HasCPUIDFlag(uint type, uint index, uint bit) +{ + int cpu_info[4] = {-1}; + ottd_cpuid(cpu_info, 0); + uint max_info_type = cpu_info[0]; + if (max_info_type < type) return false; + + ottd_cpuid(cpu_info, type); + return HasBit(cpu_info[index], bit); +} diff --git a/src/cpu.h b/src/cpu.h --- a/src/cpu.h +++ b/src/cpu.h @@ -25,4 +25,13 @@ uint64 ottd_rdtsc(); */ void ottd_cpuid(int info[4], int type); +/** + * Check whether the current CPU has the given flag. + * @param type The type to be passing to cpuid (usually 1). + * @param index The index in the returned info array. + * @param bit The bit index that needs to be set. + * @return The value of the bit, or false when there is no CPUID or the type is not available. + */ +bool HasCPUIDFlag(uint type, uint index, uint bit); + #endif /* CPU_H */ diff --git a/src/viewport_sprite_sorter_sse4.cpp b/src/viewport_sprite_sorter_sse4.cpp --- a/src/viewport_sprite_sorter_sse4.cpp +++ b/src/viewport_sprite_sorter_sse4.cpp @@ -97,13 +97,7 @@ void ViewportSortParentSpritesSSE41(Pare */ bool ViewportSortParentSpritesSSE41Checker() { - int cpu_info[4] = {-1}; - ottd_cpuid(cpu_info, 0); - unsigned int max_info_type = cpu_info[0]; - if (max_info_type < 1) return false; - - ottd_cpuid(cpu_info, 1); - return (cpu_info[2] & (1 << 19)) != 0; + return HasCPUIDFlag(1, 2, 19); } #endif /* WITH_SSE */