1;*****************************************************************************
2;* Copyright (C) 2005-2010 x264 project
3;*
4;* Authors: Loren Merritt <lorenm@u.washington.edu>
5;*          Fiona Glaser <fiona@x264.com>
6;*
7;* This file is part of FFmpeg.
8;*
9;* FFmpeg is free software; you can redistribute it and/or
10;* modify it under the terms of the GNU Lesser General Public
11;* License as published by the Free Software Foundation; either
12;* version 2.1 of the License, or (at your option) any later version.
13;*
14;* FFmpeg is distributed in the hope that it will be useful,
15;* but WITHOUT ANY WARRANTY; without even the implied warranty of
16;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17;* Lesser General Public License for more details.
18;*
19;* You should have received a copy of the GNU Lesser General Public
20;* License along with FFmpeg; if not, write to the Free Software
21;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22;******************************************************************************
23
24%include "x86util.asm"
25
26SECTION .text
27
28;-----------------------------------------------------------------------------
29; void ff_cpu_cpuid(int index, int *eax, int *ebx, int *ecx, int *edx)
30;-----------------------------------------------------------------------------
31cglobal cpu_cpuid, 5,7
32    push rbx
33    push  r4
34    push  r3
35    push  r2
36    push  r1
37    mov  eax, r0d
38    xor  ecx, ecx
39    cpuid
40    pop   r4
41    mov [r4], eax
42    pop   r4
43    mov [r4], ebx
44    pop   r4
45    mov [r4], ecx
46    pop   r4
47    mov [r4], edx
48    pop  rbx
49    RET
50
51;-----------------------------------------------------------------------------
52; void ff_cpu_xgetbv(int op, int *eax, int *edx)
53;-----------------------------------------------------------------------------
54cglobal cpu_xgetbv, 3,7
55    push  r2
56    push  r1
57    mov  ecx, r0d
58    xgetbv
59    pop   r4
60    mov [r4], eax
61    pop   r4
62    mov [r4], edx
63    RET
64
65%if ARCH_X86_64 == 0
66;-----------------------------------------------------------------------------
67; int ff_cpu_cpuid_test(void)
68; return 0 if unsupported
69;-----------------------------------------------------------------------------
70cglobal cpu_cpuid_test
71    pushfd
72    push    ebx
73    push    ebp
74    push    esi
75    push    edi
76    pushfd
77    pop     eax
78    mov     ebx, eax
79    xor     eax, 0x200000
80    push    eax
81    popfd
82    pushfd
83    pop     eax
84    xor     eax, ebx
85    pop     edi
86    pop     esi
87    pop     ebp
88    pop     ebx
89    popfd
90    ret
91%endif
92