mmx_util.c
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:6k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "mmx_util.h"
  36. /*
  37.  * Check if current CPU supports Intel MMX instruction set.
  38.  * Use:
  39.  *  int checkMmxAvailablity ();
  40.  * Returns:
  41.  *
  42.  *    Bit mask for the above defines.
  43.  *  
  44.  * Side effects:
  45.  */
  46. int checkMmxAvailablity()
  47. {
  48.     /* 1 if MMX instruction set is available: */
  49.     int  mmxAvailable = 0;
  50.     int  kniAvailable = 0;
  51.     int  nRetMask = 0;
  52. #ifdef _M_IX86
  53.     __asm {
  54.         pushfd                  // Get original EFLAGS
  55.         pop     eax             // Get original EFLAGS
  56.         mov     ecx,eax         // Save original EFLAGS
  57.         xor     eax,240000h     // Flip ID & AC bits in EFLAGS
  58.         push    eax             // Save new EFLAGS value on  stack
  59.         popfd                   // Replace current EFLAGS value
  60.         pushfd                  // Get new EFLAGS
  61.         pop     eax             // Store new EFLAGS in EAX
  62.         xor     eax,ecx         // Can not toggle ID & AC bits
  63.         cmp     eax,240000h     // check if both ID & AC were inversed
  64.         jnz     no_mmx
  65.         push    ebx             // save ebx
  66.         mov     eax,1
  67.         _emit   0x0f            // CPUID
  68.         _emit   0xa2
  69.         shr     edx,23          // shift to MM FLAG: 800000h
  70.         pop     ebx             // restore ebx
  71.         mov     eax,edx
  72.         shr     edx,2           // shift to KNI FLAG
  73.         and     eax,1
  74.         and     edx,1
  75.         jmp     set_flags
  76. no_mmx:
  77.         xor     eax,eax
  78.         xor     edx,edx
  79. set_flags:
  80.         mov     mmxAvailable,eax
  81.         mov     kniAvailable,edx
  82.     }
  83. #elif defined __i386 && ( defined __linux || defined __svr4__ || defined VXWORKS )
  84. int family = 0;
  85. int model = 0, stepping = 0;
  86. int has_mmx = 0, has_kni = 0;
  87.     __asm__ __volatile (
  88.         "       pushl   %%eax               n"
  89.         "       pushl   %%ebx               n"
  90.         "       pushl   %%ecx               n"
  91.         "       pushl   %%edx               n"
  92.         "       pushfl                      n"
  93.         "       popl    %%eax               n"
  94.         "       movl    %%eax, %%ebx        n"
  95.         "       xorl    $0x200000, %%eax    n"
  96.         "       pushl   %%eax               n"
  97.         "       popfl                       n"
  98.         "       pushfl                      n"
  99.         "       popl    %%eax               n"
  100.         "       xorl    %%ebx, %%eax        n"
  101.         "       andl    $0x200000, %%eax    n"
  102.         "       jz      jumphere            n"
  103.         "       xorl    %%eax, %%eax        n"
  104.         "       cpuid                       n"
  105.         "       or      %%eax, %%eax        n"
  106.         "       jz      jumphere            n"
  107.         "       movl    $1, %%eax           n"
  108.         "       cpuid                       n"
  109.         "       movl    %%eax, %%ecx        n"
  110.         "       andl    $0xf00, %%ecx       n"
  111.         "       shrl    $8, %%ecx           n"
  112.         "       movl    %%ecx, %0           n"
  113.         "       movl    %%eax, %%ecx        n"
  114.         "       andl    $0xf0, %%ecx        n"
  115.         "       shrl    $4, %%ecx           n"
  116.         "       movl    %%ecx, %1           n"
  117.         "       movl    %%eax, %%ecx        n"
  118.         "       andl    $0x0f, %%ecx        n"
  119.         "       movl    %%ecx, %2           n"
  120.         "       movl    %%edx, %%eax        n"
  121.         "       andl    $0x800000, %%eax    n"
  122.         "       jz      jumphere            n"
  123.         "       mov     $1, %%eax           n"
  124.         "       mov     %%eax, %3           n"
  125.         "       and     $0x2000000, %%edx   n"
  126.         "       mov     %%edx, %4           n"
  127.         "jumphere:                          n"
  128.         "       popl    %%edx               n"
  129.         "       popl    %%ecx               n"
  130.         "       popl    %%ebx               n"
  131.         "       popl    %%eax               n"
  132.         :"=m" (family),"=m" (model), "=m" (stepping), "=m" (has_mmx), "=m" (has_kni)
  133.         : /*no input*/
  134.         : "eax","ebx","ecx","edx"
  135.     );
  136.     mmxAvailable = has_mmx;
  137.     kniAvailable = has_kni;
  138. #else // defined(_WIN32) && defined(_M_IX86)
  139.     
  140. #endif /* _M_IX86 */
  141.     if( mmxAvailable )
  142.         nRetMask |= CPU_HAS_MMX; 
  143.     if( kniAvailable )
  144.         nRetMask |= CPU_HAS_KNI;
  145.     
  146.     return nRetMask;
  147. }