1 ; 2 ; jsimdcpu.asm - SIMD instruction support check 3 ; 4 ; Copyright 2009 Pierre Ossman <ossman (a] cendio.se> for Cendio AB 5 ; 6 ; Based on 7 ; x86 SIMD extension for IJG JPEG library 8 ; Copyright (C) 1999-2006, MIYASAKA Masaru. 9 ; For conditions of distribution and use, see copyright notice in jsimdext.inc 10 ; 11 ; This file should be assembled with NASM (Netwide Assembler), 12 ; can *not* be assembled with Microsoft's MASM or any compatible 13 ; assembler (including Borland's Turbo Assembler). 14 ; NASM is available from http://nasm.sourceforge.net/ or 15 ; http://sourceforge.net/project/showfiles.php?group_id=6208 16 ; 17 ; [TAB8] 18 19 %include "jsimdext.inc" 20 21 ; -------------------------------------------------------------------------- 22 SECTION SEG_TEXT 23 BITS 32 24 ; 25 ; Check if the CPU supports SIMD instructions 26 ; 27 ; GLOBAL(unsigned int) 28 ; jpeg_simd_cpu_support (void) 29 ; 30 31 align 16 32 global EXTN(jpeg_simd_cpu_support) PRIVATE 33 34 EXTN(jpeg_simd_cpu_support): 35 push ebx 36 ; push ecx ; need not be preserved 37 ; push edx ; need not be preserved 38 ; push esi ; unused 39 push edi 40 41 xor edi,edi ; simd support flag 42 43 pushfd 44 pop eax 45 mov edx,eax 46 xor eax, 1<<21 ; flip ID bit in EFLAGS 47 push eax 48 popfd 49 pushfd 50 pop eax 51 xor eax,edx 52 jz short .return ; CPUID is not supported 53 54 ; Check for MMX instruction support 55 xor eax,eax 56 cpuid 57 test eax,eax 58 jz short .return 59 60 xor eax,eax 61 inc eax 62 cpuid 63 mov eax,edx ; eax = Standard feature flags 64 65 test eax, 1<<23 ; bit23:MMX 66 jz short .no_mmx 67 or edi, byte JSIMD_MMX 68 .no_mmx: 69 test eax, 1<<25 ; bit25:SSE 70 jz short .no_sse 71 or edi, byte JSIMD_SSE 72 .no_sse: 73 test eax, 1<<26 ; bit26:SSE2 74 jz short .no_sse2 75 or edi, byte JSIMD_SSE2 76 .no_sse2: 77 78 ; Check for 3DNow! instruction support 79 mov eax, 0x80000000 80 cpuid 81 cmp eax, 0x80000000 82 jbe short .return 83 84 mov eax, 0x80000001 85 cpuid 86 mov eax,edx ; eax = Extended feature flags 87 88 test eax, 1<<31 ; bit31:3DNow!(vendor independent) 89 jz short .no_3dnow 90 or edi, byte JSIMD_3DNOW 91 .no_3dnow: 92 93 .return: 94 mov eax,edi 95 96 pop edi 97 ; pop esi ; unused 98 ; pop edx ; need not be preserved 99 ; pop ecx ; need not be preserved 100 pop ebx 101 ret 102 103 ; For some reason, the OS X linker does not honor the request to align the 104 ; segment unless we do this. 105 align 16 106