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