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