improve ia-32 checks to include cpuid, bswap, sse3 and ssse3 support
[platform/upstream/flac.git] / src / libFLAC / ia32 / cpu_asm.nasm
1 ;  libFLAC - Free Lossless Audio Codec library
2 ;  Copyright (C) 2001,2002,2003,2004,2005,2006,2007  Josh Coalson
3 ;
4 ;  Redistribution and use in source and binary forms, with or without
5 ;  modification, are permitted provided that the following conditions
6 ;  are met:
7 ;
8 ;  - Redistributions of source code must retain the above copyright
9 ;  notice, this list of conditions and the following disclaimer.
10 ;
11 ;  - Redistributions in binary form must reproduce the above copyright
12 ;  notice, this list of conditions and the following disclaimer in the
13 ;  documentation and/or other materials provided with the distribution.
14 ;
15 ;  - Neither the name of the Xiph.org Foundation nor the names of its
16 ;  contributors may be used to endorse or promote products derived from
17 ;  this software without specific prior written permission.
18 ;
19 ;  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 ;  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 ;  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 ;  A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
23 ;  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 ;  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 ;  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26 ;  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27 ;  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28 ;  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29 ;  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31 %include "nasm.h"
32
33         data_section
34
35 cglobal FLAC__cpu_have_cpuid_asm_ia32
36 cglobal FLAC__cpu_info_asm_ia32
37 cglobal FLAC__cpu_info_extended_amd_asm_ia32
38
39         code_section
40
41 ; **********************************************************************
42 ;
43 ; FLAC__uint32 FLAC__cpu_have_cpuid_asm_ia32()
44 ;
45
46 cident FLAC__cpu_have_cpuid_asm_ia32
47         push    ebx
48         pushfd
49         pop     eax
50         mov     edx, eax
51         xor     eax, 0x00200000
52         push    eax
53         popfd
54         pushfd
55         pop     eax
56         cmp     eax, edx
57         jz      .no_cpuid
58         mov     eax, 1
59         jmp     .end
60 .no_cpuid:
61         xor     eax, eax
62 .end:
63         pop     ebx
64         ret
65
66 ; **********************************************************************
67 ;
68 ; void FLAC__cpu_info_asm_ia32(FLAC__uint32 *flags_edx, FLAC__uint32 *flags_ecx)
69 ;
70
71 cident FLAC__cpu_info_asm_ia32
72         ;[esp + 8] == flags_edx
73         ;[esp + 12] == flags_ecx
74
75         push    ebx
76         call    FLAC__cpu_have_cpuid_asm_ia32
77         test    eax, eax
78         jz      .no_cpuid
79         mov     eax, 1
80         cpuid
81         mov     ebx, [esp + 8]
82         mov     [ebx], edx
83         mov     ebx, [esp + 12]
84         mov     [ebx], ecx
85         jmp     .end
86 .no_cpuid
87         xor     eax, eax
88         mov     ebx, [esp + 8]
89         mov     [ebx], eax
90         mov     ebx, [esp + 12]
91         mov     [ebx], eax
92 .end
93         pop     ebx
94         ret
95
96 cident FLAC__cpu_info_extended_amd_asm_ia32
97         push    ebx
98         call    FLAC__cpu_have_cpuid_asm_ia32
99         test    eax, eax
100         jz      .no_cpuid
101         mov     eax, 0x80000000
102         cpuid
103         cmp     eax, 0x80000001
104         jb      .no_cpuid
105         mov     eax, 0x80000001
106         cpuid
107         mov     eax, edx
108         jmp     .end
109 .no_cpuid
110         xor     eax, eax
111 .end
112         pop     ebx
113         ret
114
115 end
116
117 %ifdef OBJ_FORMAT_elf
118        section .note.GNU-stack noalloc
119 %endif