cpu_asm.nasm revision c74663799493f2b1e6123c18def94295d0afab7b
1;  vim:filetype=nasm ts=8
2
3;  libFLAC - Free Lossless Audio Codec library
4;  Copyright (C) 2001,2002,2003,2004,2005,2006,2007  Josh Coalson
5;
6;  Redistribution and use in source and binary forms, with or without
7;  modification, are permitted provided that the following conditions
8;  are met:
9;
10;  - Redistributions of source code must retain the above copyright
11;  notice, this list of conditions and the following disclaimer.
12;
13;  - 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.
32
33%include "nasm.h"
34
35	data_section
36
37cglobal FLAC__cpu_have_cpuid_asm_ia32
38cglobal FLAC__cpu_info_asm_ia32
39cglobal FLAC__cpu_info_extended_amd_asm_ia32
40
41	code_section
42
43; **********************************************************************
44;
45; FLAC__uint32 FLAC__cpu_have_cpuid_asm_ia32()
46;
47
48cident FLAC__cpu_have_cpuid_asm_ia32
49	push	ebx
50	pushfd
51	pop	eax
52	mov	edx, eax
53	xor	eax, 0x00200000
54	push	eax
55	popfd
56	pushfd
57	pop	eax
58	cmp	eax, edx
59	jz	.no_cpuid
60	mov	eax, 1
61	jmp	.end
62.no_cpuid:
63	xor	eax, eax
64.end:
65	pop	ebx
66	ret
67
68; **********************************************************************
69;
70; void FLAC__cpu_info_asm_ia32(FLAC__uint32 *flags_edx, FLAC__uint32 *flags_ecx)
71;
72
73cident FLAC__cpu_info_asm_ia32
74	;[esp + 8] == flags_edx
75	;[esp + 12] == flags_ecx
76
77	push	ebx
78	call	FLAC__cpu_have_cpuid_asm_ia32
79	test	eax, eax
80	jz	.no_cpuid
81	mov	eax, 1
82	cpuid
83	mov	ebx, [esp + 8]
84	mov	[ebx], edx
85	mov	ebx, [esp + 12]
86	mov	[ebx], ecx
87	jmp	.end
88.no_cpuid
89	xor	eax, eax
90	mov	ebx, [esp + 8]
91	mov	[ebx], eax
92	mov	ebx, [esp + 12]
93	mov	[ebx], eax
94.end
95	pop	ebx
96	ret
97
98cident FLAC__cpu_info_extended_amd_asm_ia32
99	push	ebx
100	call	FLAC__cpu_have_cpuid_asm_ia32
101	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
111.no_cpuid
112	xor	eax, eax
113.end
114	pop	ebx
115	ret
116
117end
118
119%ifdef OBJ_FORMAT_elf
120       section .note.GNU-stack noalloc
121%endif
122