;*****************************************************************************
-;* cpu-a.asm: h264 encoder library
+;* cpu-a.asm: x86 cpu utilities
;*****************************************************************************
-;* Copyright (C) 2003-2008 x264 project
+;* Copyright (C) 2003-2011 x264 project
;*
;* Authors: Laurent Aimar <fenrir@via.ecp.fr>
;* Loren Merritt <lorenm@u.washington.edu>
;* You should have received a copy of the GNU General Public License
;* along with this program; if not, write to the Free Software
;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA.
+;*
+;* This program is also available under a commercial proprietary license.
+;* For more information, contact us at licensing@x264.com.
;*****************************************************************************
%include "x86inc.asm"
SECTION .text
-%ifdef ARCH_X86_64
-
;-----------------------------------------------------------------------------
-; int x264_cpu_cpuid( int op, int *eax, int *ebx, int *ecx, int *edx )
+; void cpu_cpuid( int op, int *eax, int *ebx, int *ecx, int *edx )
;-----------------------------------------------------------------------------
-cglobal x264_cpu_cpuid, 5,7
- push rbx
- mov r11, r1
- mov r10, r2
- movifnidn r9, r3
- movifnidn r8, r4
- mov eax, r0d
+cglobal cpu_cpuid, 5,7
+ push rbx
+ push r4
+ push r3
+ push r2
+ push r1
+ mov eax, r0d
cpuid
- mov [r11], eax
- mov [r10], ebx
- mov [r9], ecx
- mov [r8], edx
- pop rbx
+ pop rsi
+ mov [rsi], eax
+ pop rsi
+ mov [rsi], ebx
+ pop rsi
+ mov [rsi], ecx
+ pop rsi
+ mov [rsi], edx
+ pop rbx
+ RET
+
+;-----------------------------------------------------------------------------
+; void cpu_xgetbv( int op, int *eax, int *edx )
+;-----------------------------------------------------------------------------
+cglobal cpu_xgetbv, 3,7
+ push r2
+ push r1
+ mov ecx, r0d
+ xgetbv
+ pop rsi
+ mov [rsi], eax
+ pop rsi
+ mov [rsi], edx
RET
-%else
+%ifndef ARCH_X86_64
;-----------------------------------------------------------------------------
-; int x264_cpu_cpuid_test( void )
+; int cpu_cpuid_test( void )
; return 0 if unsupported
;-----------------------------------------------------------------------------
-cglobal x264_cpu_cpuid_test
+cglobal cpu_cpuid_test
pushfd
push ebx
push ebp
ret
;-----------------------------------------------------------------------------
-; int x264_cpu_cpuid( int op, int *eax, int *ebx, int *ecx, int *edx )
+; void stack_align( void (*func)(void*), void *arg );
;-----------------------------------------------------------------------------
-cglobal x264_cpu_cpuid, 0,6
- mov eax, r0m
- cpuid
- mov esi, r1m
- mov [esi], eax
- mov esi, r2m
- mov [esi], ebx
- mov esi, r3m
- mov [esi], ecx
- mov esi, r4m
- mov [esi], edx
- RET
-
-;-----------------------------------------------------------------------------
-; void x264_stack_align( void (*func)(void*), void *arg );
-;-----------------------------------------------------------------------------
-cglobal x264_stack_align
+cglobal stack_align
push ebp
mov ebp, esp
- sub esp, 4
+ sub esp, 12
and esp, ~15
mov ecx, [ebp+8]
mov edx, [ebp+12]
mov [esp], edx
+ mov edx, [ebp+16]
+ mov [esp+4], edx
+ mov edx, [ebp+20]
+ mov [esp+8], edx
call ecx
leave
ret
%endif
;-----------------------------------------------------------------------------
-; void x264_emms( void )
+; void cpu_emms( void )
;-----------------------------------------------------------------------------
-cglobal x264_emms
+cglobal cpu_emms
emms
ret
;-----------------------------------------------------------------------------
-; void x264_cpu_mask_misalign_sse(void)
+; void cpu_sfence( void )
+;-----------------------------------------------------------------------------
+cglobal cpu_sfence
+ sfence
+ ret
+
+;-----------------------------------------------------------------------------
+; void cpu_mask_misalign_sse( void )
;-----------------------------------------------------------------------------
-cglobal x264_cpu_mask_misalign_sse
+cglobal cpu_mask_misalign_sse
sub rsp, 4
stmxcsr [rsp]
or dword [rsp], 1<<17