Imported Upstream version 1.4
[deb_x265.git] / source / common / x86 / cpu-a.asm
CommitLineData
72b9787e
JB
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;* Fiona Glaser <fiona@x264.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 license @ x265.com.
26;*****************************************************************************
27
28%include "x86inc.asm"
29
30SECTION .text
31
32;-----------------------------------------------------------------------------
33; void cpu_cpuid( int op, int *eax, int *ebx, int *ecx, int *edx )
34;-----------------------------------------------------------------------------
35cglobal 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;-----------------------------------------------------------------------------
58cglobal 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;-----------------------------------------------------------------------------
74cglobal 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;-----------------------------------------------------------------------------
95cglobal 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
117cglobal 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;-----------------------------------------------------------------------------
138cglobal cpu_emms
139 emms
140 ret
141
142;-----------------------------------------------------------------------------
143; void cpu_sfence( void )
144;-----------------------------------------------------------------------------
145cglobal cpu_sfence
146 sfence
147 ret
148
149cextern intel_cpu_indicator_init
150
151;-----------------------------------------------------------------------------
152; void safe_intel_cpu_indicator_init( void );
153;-----------------------------------------------------------------------------
154cglobal 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