| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- ;
- ;
- ; assembler routines to detect CPU-features
- ;
- ; MMX / 3DNow! / SSE / SSE2
- ;
- ; for the LAME project
- ; Frank Klemm, Robert Hegemann 2000-10-12
- ;
- %include "nasm.h"
- globaldef has_MMX_nasm
- globaldef has_3DNow_nasm
- globaldef has_SSE_nasm
- globaldef has_SSE2_nasm
- segment_code
- testCPUID:
- pushfd
- pop eax
- mov ecx,eax
- xor eax,0x200000
- push eax
- popfd
- pushfd
- pop eax
- cmp eax,ecx
- ret
- ;---------------------------------------
- ; int has_MMX_nasm (void)
- ;---------------------------------------
- has_MMX_nasm:
- pushad
- call testCPUID
- jz return0 ; no CPUID command, so no MMX
- mov eax,0x1
- CPUID
- test edx,0x800000
- jz return0 ; no MMX support
- jmp return1 ; MMX support
-
- ;---------------------------------------
- ; int has_SSE_nasm (void)
- ;---------------------------------------
- has_SSE_nasm:
- pushad
- call testCPUID
- jz return0 ; no CPUID command, so no SSE
-
- mov eax,0x1
- CPUID
- test edx,0x02000000
- jz return0 ; no SSE support
- jmp return1 ; SSE support
-
- ;---------------------------------------
- ; int has_SSE2_nasm (void)
- ;---------------------------------------
- has_SSE2_nasm:
- pushad
- call testCPUID
- jz return0 ; no CPUID command, so no SSE2
-
- mov eax,0x1
- CPUID
- test edx,0x04000000
- jz return0 ; no SSE2 support
- jmp return1 ; SSE2 support
-
- ;---------------------------------------
- ; int has_3DNow_nasm (void)
- ;---------------------------------------
- has_3DNow_nasm:
- pushad
- call testCPUID
- jz return0 ; no CPUID command, so no 3DNow!
- mov eax,0x80000000
- CPUID
- cmp eax,0x80000000
- jbe return0 ; no extended MSR(1), so no 3DNow!
- mov eax,0x80000001
- CPUID
- test edx,0x80000000
- jz return0 ; no 3DNow! support
- ; 3DNow! support
- return1:
- popad
- xor eax,eax
- inc eax
- ret
- return0:
- popad
- xor eax,eax
- ret
-
- end
|