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