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
34EXTN(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
106