blob: 05a4e6f2387b50a42ad973e3854cca97ca638263 [file] [log] [blame]
Josh Coalsonbe5e19b2007-03-22 03:13:11 +00001; vim:filetype=nasm ts=8
2
Josh Coalsonafd81072003-01-31 23:34:56 +00003; libFLAC - Free Lossless Audio Codec library
Josh Coalsondea0f5a2009-01-07 07:31:28 +00004; Copyright (C) 2001,2002,2003,2004,2005,2006,2007,2008,2009 Josh Coalson
Josh Coalson9a7b5e22001-06-13 18:03:09 +00005;
Josh Coalsonafd81072003-01-31 23:34:56 +00006; Redistribution and use in source and binary forms, with or without
7; modification, are permitted provided that the following conditions
8; are met:
Josh Coalson9a7b5e22001-06-13 18:03:09 +00009;
Josh Coalsonafd81072003-01-31 23:34:56 +000010; - Redistributions of source code must retain the above copyright
11; notice, this list of conditions and the following disclaimer.
Josh Coalson9a7b5e22001-06-13 18:03:09 +000012;
Josh Coalsonafd81072003-01-31 23:34:56 +000013; - Redistributions in binary form must reproduce the above copyright
14; notice, this list of conditions and the following disclaimer in the
15; documentation and/or other materials provided with the distribution.
16;
17; - Neither the name of the Xiph.org Foundation nor the names of its
18; contributors may be used to endorse or promote products derived from
19; this software without specific prior written permission.
20;
21; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22; ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
25; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Josh Coalson9a7b5e22001-06-13 18:03:09 +000032
33%include "nasm.h"
34
35 data_section
36
Josh Coalsonf2f328b2007-03-13 06:35:55 +000037cglobal FLAC__cpu_have_cpuid_asm_ia32
Josh Coalsone6499bd2001-06-13 18:11:25 +000038cglobal FLAC__cpu_info_asm_ia32
Josh Coalsonf5925df2001-07-16 21:13:19 +000039cglobal FLAC__cpu_info_extended_amd_asm_ia32
Josh Coalson9a7b5e22001-06-13 18:03:09 +000040
41 code_section
42
43; **********************************************************************
44;
Josh Coalsonf2f328b2007-03-13 06:35:55 +000045; FLAC__uint32 FLAC__cpu_have_cpuid_asm_ia32()
46;
Josh Coalson9a7b5e22001-06-13 18:03:09 +000047
Josh Coalsonf2f328b2007-03-13 06:35:55 +000048cident FLAC__cpu_have_cpuid_asm_ia32
49 push ebx
Josh Coalson9a7b5e22001-06-13 18:03:09 +000050 pushfd
51 pop eax
52 mov edx, eax
Josh Coalsonf5925df2001-07-16 21:13:19 +000053 xor eax, 0x00200000
Josh Coalson9a7b5e22001-06-13 18:03:09 +000054 push eax
55 popfd
56 pushfd
57 pop eax
58 cmp eax, edx
59 jz .no_cpuid
60 mov eax, 1
Josh Coalsonf5925df2001-07-16 21:13:19 +000061 jmp .end
62.no_cpuid:
63 xor eax, eax
64.end:
Josh Coalsonf2f328b2007-03-13 06:35:55 +000065 pop ebx
Josh Coalsonf5925df2001-07-16 21:13:19 +000066 ret
67
Josh Coalsonf2f328b2007-03-13 06:35:55 +000068; **********************************************************************
69;
70; void FLAC__cpu_info_asm_ia32(FLAC__uint32 *flags_edx, FLAC__uint32 *flags_ecx)
71;
72
Josh Coalsonf5925df2001-07-16 21:13:19 +000073cident FLAC__cpu_info_asm_ia32
Josh Coalsonf2f328b2007-03-13 06:35:55 +000074 ;[esp + 8] == flags_edx
75 ;[esp + 12] == flags_ecx
76
Josh Coalsonf5925df2001-07-16 21:13:19 +000077 push ebx
Josh Coalsonf2f328b2007-03-13 06:35:55 +000078 call FLAC__cpu_have_cpuid_asm_ia32
Josh Coalsonf5925df2001-07-16 21:13:19 +000079 test eax, eax
80 jz .no_cpuid
81 mov eax, 1
Josh Coalson9a7b5e22001-06-13 18:03:09 +000082 cpuid
Josh Coalsonf2f328b2007-03-13 06:35:55 +000083 mov ebx, [esp + 8]
84 mov [ebx], edx
85 mov ebx, [esp + 12]
86 mov [ebx], ecx
Josh Coalsonf5925df2001-07-16 21:13:19 +000087 jmp .end
Josh Coalson08bfd422008-09-09 07:06:09 +000088.no_cpuid:
Josh Coalsonf5925df2001-07-16 21:13:19 +000089 xor eax, eax
Josh Coalsonf2f328b2007-03-13 06:35:55 +000090 mov ebx, [esp + 8]
91 mov [ebx], eax
92 mov ebx, [esp + 12]
93 mov [ebx], eax
Josh Coalson08bfd422008-09-09 07:06:09 +000094.end:
Josh Coalsonf5925df2001-07-16 21:13:19 +000095 pop ebx
96 ret
97
98cident FLAC__cpu_info_extended_amd_asm_ia32
99 push ebx
Josh Coalsonf2f328b2007-03-13 06:35:55 +0000100 call FLAC__cpu_have_cpuid_asm_ia32
Josh Coalsonf5925df2001-07-16 21:13:19 +0000101 test eax, eax
102 jz .no_cpuid
103 mov eax, 0x80000000
104 cpuid
105 cmp eax, 0x80000001
106 jb .no_cpuid
107 mov eax, 0x80000001
108 cpuid
109 mov eax, edx
110 jmp .end
Josh Coalson08bfd422008-09-09 07:06:09 +0000111.no_cpuid:
Josh Coalsonf5925df2001-07-16 21:13:19 +0000112 xor eax, eax
Josh Coalson08bfd422008-09-09 07:06:09 +0000113.end:
Josh Coalson9a7b5e22001-06-13 18:03:09 +0000114 pop ebx
115 ret
116
Josh Coalson9a7b5e22001-06-13 18:03:09 +0000117end