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