1; 2; 3; assembler routines to detect CPU-features 4; 5; MMX / 3DNow! / SSE / SSE2 6; 7; for the LAME project 8; Frank Klemm, Robert Hegemann 2000-10-12 9; 10 11%include "nasm.h" 12 13 globaldef has_MMX_nasm 14 globaldef has_3DNow_nasm 15 globaldef has_SSE_nasm 16 globaldef has_SSE2_nasm 17 18 segment_code 19 20testCPUID: 21 pushfd 22 pop eax 23 mov ecx,eax 24 xor eax,0x200000 25 push eax 26 popfd 27 pushfd 28 pop eax 29 cmp eax,ecx 30 ret 31 32;--------------------------------------- 33; int has_MMX_nasm (void) 34;--------------------------------------- 35 36has_MMX_nasm: 37 pushad 38 call testCPUID 39 jz return0 ; no CPUID command, so no MMX 40 41 mov eax,0x1 42 CPUID 43 test edx,0x800000 44 jz return0 ; no MMX support 45 jmp return1 ; MMX support 46 47;--------------------------------------- 48; int has_SSE_nasm (void) 49;--------------------------------------- 50 51has_SSE_nasm: 52 pushad 53 call testCPUID 54 jz return0 ; no CPUID command, so no SSE 55 56 mov eax,0x1 57 CPUID 58 test edx,0x02000000 59 jz return0 ; no SSE support 60 jmp return1 ; SSE support 61 62;--------------------------------------- 63; int has_SSE2_nasm (void) 64;--------------------------------------- 65 66has_SSE2_nasm: 67 pushad 68 call testCPUID 69 jz return0 ; no CPUID command, so no SSE2 70 71 mov eax,0x1 72 CPUID 73 test edx,0x04000000 74 jz return0 ; no SSE2 support 75 jmp return1 ; SSE2 support 76 77;--------------------------------------- 78; int has_3DNow_nasm (void) 79;--------------------------------------- 80 81has_3DNow_nasm: 82 pushad 83 call testCPUID 84 jz return0 ; no CPUID command, so no 3DNow! 85 86 mov eax,0x80000000 87 CPUID 88 cmp eax,0x80000000 89 jbe return0 ; no extended MSR(1), so no 3DNow! 90 91 mov eax,0x80000001 92 CPUID 93 test edx,0x80000000 94 jz return0 ; no 3DNow! support 95 ; 3DNow! support 96return1: 97 popad 98 xor eax,eax 99 inc eax 100 ret 101 102return0: 103 popad 104 xor eax,eax 105 ret 106 107 end 108