| Index: third_party/libjpeg_turbo/simd/jsimdcpu.asm
|
| ===================================================================
|
| --- third_party/libjpeg_turbo/simd/jsimdcpu.asm (revision 0)
|
| +++ third_party/libjpeg_turbo/simd/jsimdcpu.asm (revision 0)
|
| @@ -0,0 +1,105 @@
|
| +;
|
| +; jsimdcpu.asm - SIMD instruction support check
|
| +;
|
| +; Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
|
| +;
|
| +; Based on
|
| +; x86 SIMD extension for IJG JPEG library
|
| +; Copyright (C) 1999-2006, MIYASAKA Masaru.
|
| +; For conditions of distribution and use, see copyright notice in jsimdext.inc
|
| +;
|
| +; This file should be assembled with NASM (Netwide Assembler),
|
| +; can *not* be assembled with Microsoft's MASM or any compatible
|
| +; assembler (including Borland's Turbo Assembler).
|
| +; NASM is available from http://nasm.sourceforge.net/ or
|
| +; http://sourceforge.net/project/showfiles.php?group_id=6208
|
| +;
|
| +; [TAB8]
|
| +
|
| +%include "jsimdext.inc"
|
| +
|
| +; --------------------------------------------------------------------------
|
| + SECTION SEG_TEXT
|
| + BITS 32
|
| +;
|
| +; Check if the CPU supports SIMD instructions
|
| +;
|
| +; GLOBAL(unsigned int)
|
| +; jpeg_simd_cpu_support (void)
|
| +;
|
| +
|
| + align 16
|
| + global EXTN(jpeg_simd_cpu_support)
|
| +
|
| +EXTN(jpeg_simd_cpu_support):
|
| + push ebx
|
| +; push ecx ; need not be preserved
|
| +; push edx ; need not be preserved
|
| +; push esi ; unused
|
| + push edi
|
| +
|
| + xor edi,edi ; simd support flag
|
| +
|
| + pushfd
|
| + pop eax
|
| + mov edx,eax
|
| + xor eax, 1<<21 ; flip ID bit in EFLAGS
|
| + push eax
|
| + popfd
|
| + pushfd
|
| + pop eax
|
| + xor eax,edx
|
| + jz short .return ; CPUID is not supported
|
| +
|
| + ; Check for MMX instruction support
|
| + xor eax,eax
|
| + cpuid
|
| + test eax,eax
|
| + jz short .return
|
| +
|
| + xor eax,eax
|
| + inc eax
|
| + cpuid
|
| + mov eax,edx ; eax = Standard feature flags
|
| +
|
| + test eax, 1<<23 ; bit23:MMX
|
| + jz short .no_mmx
|
| + or edi, byte JSIMD_MMX
|
| +.no_mmx:
|
| + test eax, 1<<25 ; bit25:SSE
|
| + jz short .no_sse
|
| + or edi, byte JSIMD_SSE
|
| +.no_sse:
|
| + test eax, 1<<26 ; bit26:SSE2
|
| + jz short .no_sse2
|
| + or edi, byte JSIMD_SSE2
|
| +.no_sse2:
|
| +
|
| + ; Check for 3DNow! instruction support
|
| + mov eax, 0x80000000
|
| + cpuid
|
| + cmp eax, 0x80000000
|
| + jbe short .return
|
| +
|
| + mov eax, 0x80000001
|
| + cpuid
|
| + mov eax,edx ; eax = Extended feature flags
|
| +
|
| + test eax, 1<<31 ; bit31:3DNow!(vendor independent)
|
| + jz short .no_3dnow
|
| + or edi, byte JSIMD_3DNOW
|
| +.no_3dnow:
|
| +
|
| +.return:
|
| + mov eax,edi
|
| +
|
| + pop edi
|
| +; pop esi ; unused
|
| +; pop edx ; need not be preserved
|
| +; pop ecx ; need not be preserved
|
| + pop ebx
|
| + ret
|
| +
|
| +; For some reason, the OS X linker does not honor the request to align the
|
| +; segment unless we do this.
|
| + align 16
|
|
|