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 |