| ; | |
| ; 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 |