[svn] / trunk / xvidcore / src / utils / x86_asm / cpuid.asm Repository:
ViewVC logotype

Diff of /trunk/xvidcore/src/utils/x86_asm/cpuid.asm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3, Fri Mar 8 02:46:11 2002 UTC revision 1794, Fri Nov 14 15:43:28 2008 UTC
# Line 1  Line 1 
1  ;/******************************************************************************  ;/****************************************************************************
2  ; *                                                                            *  ; *
3  ; *  This file is part of XviD, a free MPEG-4 video encoder/decoder            *  ; *  XVID MPEG-4 VIDEO CODEC
4  ; *                                                                            *  ; *  - CPUID check processors capabilities -
5  ; *  XviD is an implementation of a part of one or more MPEG-4 Video tools     *  ; *
6  ; *  as specified in ISO/IEC 14496-2 standard.  Those intending to use this    *  ; *  Copyright (C) 2001 Michael Militzer <isibaar@xvid.org>
7  ; *  software module in hardware or software products are advised that its     *  ; *
8  ; *  use may infringe existing patents or copyrights, and any such use         *  ; *  This program is free software ; you can redistribute it and/or modify
9  ; *  would be at such party's own risk.  The original developer of this        *  ; *  it under the terms of the GNU General Public License as published by
10  ; *  software module and his/her company, and subsequent editors and their     *  ; *  the Free Software Foundation ; either version 2 of the License, or
11  ; *  companies, will have no liability for use of this software or             *  ; *  (at your option) any later version.
12  ; *  modifications or derivatives thereof.                                     *  ; *
13  ; *                                                                            *  ; *  This program is distributed in the hope that it will be useful,
14  ; *  XviD is free software; you can redistribute it and/or modify it           *  ; *  but WITHOUT ANY WARRANTY ; without even the implied warranty of
15  ; *  under the terms of the GNU General Public License as published by         *  ; *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  ; *  the Free Software Foundation; either version 2 of the License, or         *  ; *  GNU General Public License for more details.
17  ; *  (at your option) any later version.                                       *  ; *
18  ; *                                                                            *  ; *  You should have received a copy of the GNU General Public License
19  ; *  XviD is distributed in the hope that it will be useful, but               *  ; *  along with this program ; if not, write to the Free Software
20  ; *  WITHOUT ANY WARRANTY; without even the implied warranty of                *  ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21  ; *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             *  ; *
22  ; *  GNU General Public License for more details.                              *  ; * $Id: cpuid.asm,v 1.14 2008-11-14 15:43:28 Isibaar Exp $
23  ; *                                                                            *  ; *
24  ; *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA  *  
 ; *                                                                            *  
 ; ******************************************************************************/  
 ;  
 ;/******************************************************************************  
 ; *                                                                            *  
 ; *  cpuid.asm, check cpu features                                             *  
 ; *                                                                            *  
 ; *  Copyright (C) 2001 - Michael Militzer <isibaar@xvid.org>,                 *  
 ; *                                                                            *  
 ; *  For more information visit the XviD homepage: http://www.xvid.org         *  
 ; *                                                                            *  
 ; ******************************************************************************/  
 ;  
 ;/******************************************************************************  
 ; *                                                                            *  
 ; *  Revision history:                                                         *  
 ; *                                                                            *  
 ; *  17.12.2001 initial version  (Isibaar)                                     *  
 ; *                                                                            *  
 ; ******************************************************************************/  
   
 bits 32  
   
 %define CPUID_TSC                               0x00000010  
 %define CPUID_MMX                               0x00800000  
 %define CPUID_SSE                               0x02000000  
 %define CPUID_SSE2                              0x04000000  
   
 %define EXT_CPUID_3DNOW                 0x80000000  
 %define EXT_CPUID_AMD_3DNOWEXT  0x40000000  
 %define EXT_CPUID_AMD_MMXEXT    0x00400000  
   
 %define XVID_CPU_MMX                    0x00000001  
 %define XVID_CPU_MMXEXT                 0x00000002  
 %define XVID_CPU_SSE            0x00000004  
 %define XVID_CPU_SSE2                   0x00000008  
 %define XVID_CPU_3DNOW          0x00000010  
 %define XVID_CPU_3DNOWEXT               0x00000020  
 %define XVID_CPU_TSC            0x00000040  
25    
26    BITS 32
27    
28  %macro cglobal 1  %macro cglobal 1
29          %ifdef PREFIX          %ifdef PREFIX
30                    %ifdef MARK_FUNCS
31                            global _%1:function %1.endfunc-%1
32                            %define %1 _%1:function %1.endfunc-%1
33                            %define ENDFUNC .endfunc
34                    %else
35                  global _%1                  global _%1
36                  %define %1 _%1                  %define %1 _%1
37                            %define ENDFUNC
38                    %endif
39            %else
40                    %ifdef MARK_FUNCS
41                            global %1:function %1.endfunc-%1
42                            %define ENDFUNC .endfunc
43          %else          %else
44                  global %1                  global %1
45                            %define ENDFUNC
46                    %endif
47          %endif          %endif
48  %endmacro  %endmacro
49    
50  ALIGN 32  ;=============================================================================
51    ; Constants
52    ;=============================================================================
53    
54  section .data  %define CPUID_TSC               0x00000010
55    %define CPUID_MMX               0x00800000
56    %define CPUID_SSE               0x02000000
57    %define CPUID_SSE2              0x04000000
58    %define CPUID_SSE3              0x00000001
59    %define CPUID_SSE41             0x00080000
60    
61  features        dd 0  %define EXT_CPUID_3DNOW         0x80000000
62    %define EXT_CPUID_AMD_3DNOWEXT  0x40000000
63    %define EXT_CPUID_AMD_MMXEXT    0x00400000
64    
65  vendor          dd 0,0,0  ;;; NB: Make sure these defines match the ones defined in xvid.h
66  vendorAMD       db "AuthenticAMD"  %define XVID_CPU_MMX      (1<< 0)
67    %define XVID_CPU_MMXEXT   (1<< 1)
68    %define XVID_CPU_SSE      (1<< 2)
69    %define XVID_CPU_SSE2     (1<< 3)
70    %define XVID_CPU_SSE3     (1<< 8)
71    %define XVID_CPU_SSE41    (1<< 9)
72    %define XVID_CPU_3DNOW    (1<< 4)
73    %define XVID_CPU_3DNOWEXT (1<< 5)
74    %define XVID_CPU_TSC      (1<< 6)
75    
76    ;=============================================================================
77    ; Read only data
78    ;=============================================================================
79    
80  %macro  CHECK_FEATURE         3  ALIGN 32
81    %ifdef FORMAT_COFF
82    SECTION .rodata
83    %else
84    SECTION .rodata align=16
85    %endif
86    
87      mov     ecx, %1  vendorAMD:
88      and     ecx, edx                  db "AuthenticAMD"
     neg     ecx  
     sbb     ecx, ecx  
     and     ecx, %2  
     or      [%3], ecx  
89    
90    ;=============================================================================
91    ; Macros
92    ;=============================================================================
93    
94    %macro  CHECK_FEATURE         4
95      mov eax, %1
96      and eax, %4
97      neg eax
98      sbb eax, eax
99      and eax, %2
100      or %3, eax
101  %endmacro  %endmacro
102    
103  section .text  ;=============================================================================
104    ; Code
105    ;=============================================================================
106    
107    SECTION .text
108    
109  ; int check_cpu_feature(void)  ; int check_cpu_feature(void)
110    
111  cglobal check_cpu_features  cglobal check_cpu_features
112  check_cpu_features:  check_cpu_features:
113    
114          pushad    push ebx
115          pushfd    push esi
116      push edi
117      push ebp
118    
119      sub esp, 12             ; Stack space for vendor name
120    
121      xor ebp, ebp
122    
123          ; CPUID command ?          ; CPUID command ?
124      pushfd
125          pop             eax          pop             eax
126          mov             ecx, eax          mov             ecx, eax
127          xor             eax, 0x200000          xor             eax, 0x200000
# Line 120  Line 137 
137          ; get vendor string, used later          ; get vendor string, used later
138      xor     eax, eax      xor     eax, eax
139      cpuid      cpuid
140      mov     [vendor], ebx       ; vendor string    mov [esp], ebx       ; vendor string
141      mov     [vendor+4], edx    mov [esp+4], edx
142      mov     [vendor+8], ecx    mov [esp+8], ecx
143      test    eax, eax      test    eax, eax
144    
145      jz      near .cpu_quit      jz      near .cpu_quit
# Line 130  Line 147 
147      mov     eax, 1      mov     eax, 1
148      cpuid      cpuid
149    
   
150      ; RDTSC command ?      ; RDTSC command ?
151          CHECK_FEATURE CPUID_TSC, XVID_CPU_TSC, features    CHECK_FEATURE CPUID_TSC, XVID_CPU_TSC, ebp, edx
152    
153      ; MMX support ?      ; MMX support ?
154          CHECK_FEATURE CPUID_MMX, XVID_CPU_MMX, features    CHECK_FEATURE CPUID_MMX, XVID_CPU_MMX, ebp, edx
155    
156      ; SSE support ?      ; SSE support ?
157          CHECK_FEATURE CPUID_SSE, (XVID_CPU_MMXEXT+XVID_CPU_SSE), features    CHECK_FEATURE CPUID_SSE, (XVID_CPU_MMXEXT|XVID_CPU_SSE), ebp, edx
158    
159          ; SSE2 support?          ; SSE2 support?
160          CHECK_FEATURE CPUID_SSE2, XVID_CPU_SSE2, features    CHECK_FEATURE CPUID_SSE2, XVID_CPU_SSE2, ebp, edx
161    
162      ; SSE3 support?
163      CHECK_FEATURE CPUID_SSE3, XVID_CPU_SSE3, ebp, ecx
164    
165      ; SSE41 support?
166      CHECK_FEATURE CPUID_SSE41, XVID_CPU_SSE41, ebp, ecx
167    
168          ; extended functions?          ; extended functions?
169      mov     eax, 0x80000000      mov     eax, 0x80000000
# Line 153  Line 174 
174      mov     eax, 0x80000001      mov     eax, 0x80000001
175      cpuid      cpuid
176    
     ; 3DNow! support ?  
         CHECK_FEATURE EXT_CPUID_3DNOW, XVID_CPU_3DNOW, features  
   
177          ; AMD cpu ?          ; AMD cpu ?
178      lea     esi, [vendorAMD]      lea     esi, [vendorAMD]
179      lea     edi, [vendor]    lea edi, [esp]
180      mov     ecx, 12      mov     ecx, 12
181      cld      cld
182      repe    cmpsb      repe    cmpsb
183      jnz     .cpu_quit      jnz     .cpu_quit
184    
185      ; 3DNow! support ?
186      CHECK_FEATURE EXT_CPUID_3DNOW, XVID_CPU_3DNOW, ebp, edx
187    
188          ; 3DNOW extended ?          ; 3DNOW extended ?
189          CHECK_FEATURE EXT_CPUID_AMD_3DNOWEXT, XVID_CPU_3DNOWEXT, features    CHECK_FEATURE EXT_CPUID_AMD_3DNOWEXT, XVID_CPU_3DNOWEXT, ebp, edx
190    
191          ; extended MMX ?          ; extended MMX ?
192          CHECK_FEATURE EXT_CPUID_AMD_MMXEXT, XVID_CPU_MMXEXT, features    CHECK_FEATURE EXT_CPUID_AMD_MMXEXT, XVID_CPU_MMXEXT, ebp, edx
193    
194  .cpu_quit:  .cpu_quit:
195    
196          popad    mov eax, ebp
197    
198      add esp, 12
199    
200      pop ebp
201      pop edi
202      pop esi
203      pop ebx
204    
205      ret
206    ENDFUNC
207    
208    ; sse/sse2 operating support detection routines
209    ; these will trigger an invalid instruction signal if not supported.
210    ALIGN 16
211    cglobal sse_os_trigger
212    sse_os_trigger:
213      xorps xmm0, xmm0
214      ret
215    ENDFUNC
216    
         mov eax, [features]  
217    
218    ALIGN 16
219    cglobal sse2_os_trigger
220    sse2_os_trigger:
221      xorpd xmm0, xmm0
222          ret          ret
223    ENDFUNC
224    
225    
226    ; enter/exit mmx state
227    ALIGN 16
228    cglobal emms_mmx
229    emms_mmx:
230      emms
231      ret
232    ENDFUNC
233    
234    ; faster enter/exit mmx state
235    ALIGN 16
236    cglobal emms_3dn
237    emms_3dn:
238      femms
239      ret
240    ENDFUNC
241    
242    
243    
244    %ifidn __OUTPUT_FORMAT__,elf
245    section ".note.GNU-stack" noalloc noexec nowrite progbits
246    %endif
247    

Legend:
Removed from v.3  
changed lines
  Added in v.1794

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4