0
|
1 # KIMURA Takuhiro <kim@comtec.co.jp>
|
|
2 # Copyright 2002 Haavard Kvaalen <havardk@xmms.org>
|
|
3
|
|
4 # Get feature flags with cpuid
|
|
5 # void mpg123_getcpuid(unsigned int *fflags, unsigned int *efflags)
|
|
6
|
|
7 .text
|
|
8 .align 4
|
|
9 .globl mpg123_getcpuflags
|
|
10 .type mpg123_getcpuflags,@function
|
|
11 mpg123_getcpuflags:
|
|
12 pushl %ebp
|
|
13 movl %esp,%ebp
|
|
14 pushl %edx
|
|
15 pushl %ecx
|
|
16 pushl %ebx
|
|
17 pushfl # First test if cpuid is supported
|
|
18 pushfl # Check if the ID flag (bit 21 of eflags) sticks
|
|
19 popl %eax # Get eflags
|
|
20 movl %eax,%ebx
|
|
21 xorl $0x200000,%eax # Flip bit 21
|
|
22 pushl %eax
|
|
23 popfl # Get modified eflags to flag register
|
|
24 pushfl
|
|
25 popl %eax # Get eflags again
|
|
26 popfl # Restore original eflags
|
|
27 xorl %ebx,%eax
|
|
28 je nocpuid
|
|
29 xorl %eax,%eax
|
|
30 cpuid # Check if eax = 1 is supported
|
|
31 xorl %edx,%edx
|
|
32 cmp $1,%eax
|
|
33 jl noflags
|
|
34 movl $1,%eax # Get feature flags
|
|
35 cpuid
|
|
36 noflags:
|
|
37 movl 8(%ebp),%eax
|
|
38 movl %edx,(%eax)
|
|
39 movl $0x80000000,%eax # Check support for extended level cpuid
|
|
40 cpuid
|
|
41 xorl %edx,%edx
|
|
42 cmp $0x80000001,%eax # Get extended feature flags
|
|
43 jl noeflags
|
|
44 movl $0x80000001,%eax
|
|
45 cpuid
|
|
46 noeflags:
|
|
47 movl 12(%ebp),%eax
|
|
48 movl %edx,(%eax)
|
|
49 jmp done
|
|
50 nocpuid:
|
|
51 xorl %edx,%edx
|
|
52 movl 8(%ebp),%eax
|
|
53 movl %edx,(%eax)
|
|
54 movl 12(%ebp),%eax
|
|
55 movl %edx,(%eax)
|
|
56 done:
|
|
57 popl %ebx
|
|
58 popl %ecx
|
|
59 popl %edx
|
|
60 leave
|
|
61 ret
|