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