--- cpuid.asm 2004/03/22 22:36:24 1.5 +++ cpuid.asm 2008/08/19 09:06:48 1.12 @@ -19,7 +19,7 @@ ; * along with this program ; if not, write to the Free Software ; * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; * -; * $Id: cpuid.asm,v 1.5 2004/03/22 22:36:24 edgomez Exp $ +; * $Id: cpuid.asm,v 1.12 2008/08/19 09:06:48 Isibaar Exp $ ; * ; ***************************************************************************/ @@ -27,10 +27,19 @@ %macro cglobal 1 %ifdef PREFIX - global _%1 - %define %1 _%1 + %ifdef MARK_FUNCS + global _%1:function %1.endfunc-%1 + %define %1 _%1:function %1.endfunc-%1 + %else + global _%1 + %define %1 _%1 + %endif %else - global %1 + %ifdef MARK_FUNCS + global %1:function %1.endfunc-%1 + %else + global %1 + %endif %endif %endmacro @@ -42,6 +51,7 @@ %define CPUID_MMX 0x00800000 %define CPUID_SSE 0x02000000 %define CPUID_SSE2 0x04000000 +%define CPUID_SSE3 0x00000001 %define EXT_CPUID_3DNOW 0x80000000 %define EXT_CPUID_AMD_3DNOWEXT 0x40000000 @@ -52,6 +62,7 @@ %define XVID_CPU_MMXEXT (1<< 1) %define XVID_CPU_SSE (1<< 2) %define XVID_CPU_SSE2 (1<< 3) +%define XVID_CPU_SSE3 (1<< 8) %define XVID_CPU_3DNOW (1<< 4) %define XVID_CPU_3DNOWEXT (1<< 5) %define XVID_CPU_TSC (1<< 6) @@ -62,9 +73,9 @@ ALIGN 32 %ifdef FORMAT_COFF -SECTION .rodata data +SECTION .rodata %else -SECTION .rodata data align=16 +SECTION .rodata align=16 %endif vendorAMD: @@ -74,13 +85,13 @@ ; Macros ;============================================================================= -%macro CHECK_FEATURE 3 - mov ecx, %1 - and ecx, edx - neg ecx - sbb ecx, ecx - and ecx, %2 - or %3, ecx +%macro CHECK_FEATURE 4 + mov eax, %1 + and eax, %4 + neg eax + sbb eax, eax + and eax, %2 + or %3, eax %endmacro ;============================================================================= @@ -99,6 +110,8 @@ push edi push ebp + sub esp, 12 ; Stack space for vendor name + xor ebp, ebp ; CPUID command ? @@ -118,9 +131,9 @@ ; get vendor string, used later xor eax, eax cpuid - mov [esp-12], ebx ; vendor string - mov [esp-12+4], edx - mov [esp-12+8], ecx + mov [esp], ebx ; vendor string + mov [esp+4], edx + mov [esp+8], ecx test eax, eax jz near .cpu_quit @@ -129,16 +142,19 @@ cpuid ; RDTSC command ? - CHECK_FEATURE CPUID_TSC, XVID_CPU_TSC, ebp + CHECK_FEATURE CPUID_TSC, XVID_CPU_TSC, ebp, edx ; MMX support ? - CHECK_FEATURE CPUID_MMX, XVID_CPU_MMX, ebp + CHECK_FEATURE CPUID_MMX, XVID_CPU_MMX, ebp, edx ; SSE support ? - CHECK_FEATURE CPUID_SSE, (XVID_CPU_MMXEXT|XVID_CPU_SSE), ebp + CHECK_FEATURE CPUID_SSE, (XVID_CPU_MMXEXT|XVID_CPU_SSE), ebp, edx ; SSE2 support? - CHECK_FEATURE CPUID_SSE2, XVID_CPU_SSE2, ebp + CHECK_FEATURE CPUID_SSE2, XVID_CPU_SSE2, ebp, edx + + ; SSE3 support? + CHECK_FEATURE CPUID_SSE3, XVID_CPU_SSE3, ebp, ecx ; extended functions? mov eax, 0x80000000 @@ -151,31 +167,34 @@ ; AMD cpu ? lea esi, [vendorAMD] - lea edi, [esp-12] + lea edi, [esp] mov ecx, 12 cld repe cmpsb jnz .cpu_quit ; 3DNow! support ? - CHECK_FEATURE EXT_CPUID_3DNOW, XVID_CPU_3DNOW, ebp + CHECK_FEATURE EXT_CPUID_3DNOW, XVID_CPU_3DNOW, ebp, edx ; 3DNOW extended ? - CHECK_FEATURE EXT_CPUID_AMD_3DNOWEXT, XVID_CPU_3DNOWEXT, ebp + CHECK_FEATURE EXT_CPUID_AMD_3DNOWEXT, XVID_CPU_3DNOWEXT, ebp, edx ; extended MMX ? - CHECK_FEATURE EXT_CPUID_AMD_MMXEXT, XVID_CPU_MMXEXT, ebp + CHECK_FEATURE EXT_CPUID_AMD_MMXEXT, XVID_CPU_MMXEXT, ebp, edx .cpu_quit: mov eax, ebp + add esp, 12 + pop ebp pop edi pop esi pop ebx ret +.endfunc ; sse/sse2 operating support detection routines ; these will trigger an invalid instruction signal if not supported. @@ -184,6 +203,7 @@ sse_os_trigger: xorps xmm0, xmm0 ret +.endfunc ALIGN 16 @@ -191,6 +211,7 @@ sse2_os_trigger: xorpd xmm0, xmm0 ret +.endfunc ; enter/exit mmx state @@ -199,6 +220,7 @@ emms_mmx: emms ret +.endfunc ; faster enter/exit mmx state ALIGN 16 @@ -206,3 +228,11 @@ emms_3dn: femms ret +.endfunc + + + +%ifidn __OUTPUT_FORMAT__,elf +section ".note.GNU-stack" noalloc noexec nowrite progbits +%endif +