2036533712cda1fc1617730b69e15c337e39565a
[x262.git] / common / x86 / cpu-a.asm
1 ;*****************************************************************************
2 ;* cpu-a.asm: x86 cpu utilities
3 ;*****************************************************************************
4 ;* Copyright (C) 2003-2013 x264 project
5 ;*
6 ;* Authors: Laurent Aimar <fenrir@via.ecp.fr>
7 ;*          Loren Merritt <lorenm@u.washington.edu>
8 ;*          Jason Garrett-Glaser <darkshikari@gmail.com>
9 ;*
10 ;* This program is free software; you can redistribute it and/or modify
11 ;* it under the terms of the GNU General Public License as published by
12 ;* the Free Software Foundation; either version 2 of the License, or
13 ;* (at your option) any later version.
14 ;*
15 ;* This program is distributed in the hope that it will be useful,
16 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 ;* GNU General Public License for more details.
19 ;*
20 ;* You should have received a copy of the GNU General Public License
21 ;* along with this program; if not, write to the Free Software
22 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
23 ;*
24 ;* This program is also available under a commercial proprietary license.
25 ;* For more information, contact us at licensing@x264.com.
26 ;*****************************************************************************
27
28 %include "x86inc.asm"
29
30 SECTION .text
31
32 ;-----------------------------------------------------------------------------
33 ; void cpu_cpuid( int op, int *eax, int *ebx, int *ecx, int *edx )
34 ;-----------------------------------------------------------------------------
35 cglobal cpu_cpuid, 5,7
36     push rbx
37     push  r4
38     push  r3
39     push  r2
40     push  r1
41     mov  eax, r0d
42     xor  ecx, ecx
43     cpuid
44     pop   r4
45     mov [r4], eax
46     pop   r4
47     mov [r4], ebx
48     pop   r4
49     mov [r4], ecx
50     pop   r4
51     mov [r4], edx
52     pop  rbx
53     RET
54
55 ;-----------------------------------------------------------------------------
56 ; void cpu_xgetbv( int op, int *eax, int *edx )
57 ;-----------------------------------------------------------------------------
58 cglobal cpu_xgetbv, 3,7
59     push  r2
60     push  r1
61     mov  ecx, r0d
62     xgetbv
63     pop   r4
64     mov [r4], eax
65     pop   r4
66     mov [r4], edx
67     RET
68
69 %if ARCH_X86_64
70
71 ;-----------------------------------------------------------------------------
72 ; void stack_align( void (*func)(void*), void *arg );
73 ;-----------------------------------------------------------------------------
74 cglobal stack_align
75     push rbp
76     mov  rbp, rsp
77 %if WIN64
78     sub  rsp, 32 ; shadow space
79 %endif
80     and  rsp, ~31
81     mov  rax, r0
82     mov   r0, r1
83     mov   r1, r2
84     mov   r2, r3
85     call rax
86     leave
87     ret
88
89 %else
90
91 ;-----------------------------------------------------------------------------
92 ; int cpu_cpuid_test( void )
93 ; return 0 if unsupported
94 ;-----------------------------------------------------------------------------
95 cglobal cpu_cpuid_test
96     pushfd
97     push    ebx
98     push    ebp
99     push    esi
100     push    edi
101     pushfd
102     pop     eax
103     mov     ebx, eax
104     xor     eax, 0x200000
105     push    eax
106     popfd
107     pushfd
108     pop     eax
109     xor     eax, ebx
110     pop     edi
111     pop     esi
112     pop     ebp
113     pop     ebx
114     popfd
115     ret
116
117 cglobal stack_align
118     push ebp
119     mov  ebp, esp
120     sub  esp, 12
121     and  esp, ~31
122     mov  ecx, [ebp+8]
123     mov  edx, [ebp+12]
124     mov  [esp], edx
125     mov  edx, [ebp+16]
126     mov  [esp+4], edx
127     mov  edx, [ebp+20]
128     mov  [esp+8], edx
129     call ecx
130     leave
131     ret
132
133 %endif
134
135 ;-----------------------------------------------------------------------------
136 ; void cpu_emms( void )
137 ;-----------------------------------------------------------------------------
138 cglobal cpu_emms
139     emms
140     ret
141
142 ;-----------------------------------------------------------------------------
143 ; void cpu_sfence( void )
144 ;-----------------------------------------------------------------------------
145 cglobal cpu_sfence
146     sfence
147     ret
148
149 cextern intel_cpu_indicator_init
150
151 ;-----------------------------------------------------------------------------
152 ; void safe_intel_cpu_indicator_init( void );
153 ;-----------------------------------------------------------------------------
154 cglobal safe_intel_cpu_indicator_init
155     push r0
156     push r1
157     push r2
158     push r3
159     push r4
160     push r5
161     push r6
162 %if ARCH_X86_64
163     push r7
164     push r8
165     push r9
166     push r10
167     push r11
168     push r12
169     push r13
170     push r14
171 %endif
172     push rbp
173     mov  rbp, rsp
174 %if WIN64
175     sub  rsp, 32 ; shadow space
176 %endif
177     and  rsp, ~31
178     call intel_cpu_indicator_init
179     leave
180 %if ARCH_X86_64
181     pop r14
182     pop r13
183     pop r12
184     pop r11
185     pop r10
186     pop r9
187     pop r8
188     pop r7
189 %endif
190     pop r6
191     pop r5
192     pop r4
193     pop r3
194     pop r2
195     pop r1
196     pop r0
197     ret