Home | History | Annotate | Download | only in ia32
      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 
     37 cglobal FLAC__cpu_have_cpuid_asm_ia32
     38 cglobal FLAC__cpu_info_asm_ia32
     39 cglobal 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 
     48 cident 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 
     73 cident 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 
     98 cident 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 
    117 end
    118 
    119 %ifdef OBJ_FORMAT_elf
    120        section .note.GNU-stack noalloc
    121 %endif
    122