mmx_util.c
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:7k
源码类别:

Symbian

开发平台:

Visual C++

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