OLD | NEW |
(Empty) | |
| 1 ; |
| 2 ; jsimdcpu.asm - SIMD instruction support check |
| 3 ; |
| 4 ; Copyright 2009 Pierre Ossman <ossman@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) |
| 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 |
OLD | NEW |