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